gpt4 book ai didi

javascript - 设置 bluebird.js promise 解析的最小延迟

转载 作者:搜寻专家 更新时间:2023-11-01 05:04:50 25 4
gpt4 key购买 nike

我想保证在解决 bluebird.js 问题上有最短的延迟 promise 。

举个例子,假设我正在发出一个包含在 promise 中的请求。我想要的行为是,如果请求花费的时间少于 5 秒,我想人为地将 promise 解决的延迟增加到 5 秒。如果请求花费的时间超过 5 秒,我不希望添加任何人为延迟 - 因此它比仅向每个请求添加静态延迟要复杂一些。所有这些都应该对 promise 的消费者完全隐藏 - 他们应该只看到 promise 在 5 秒或更长时间内得到解决。

为了演示,我有一个简单的模拟实现示例,该示例将模拟请求延迟硬编码为 3 秒。

我的第一次尝试是这样的——使用 setTimeout 来确保在 5 秒过去之前不会调用解析回调。

fiddle here

function getTimestamp() {
return new Date().getTime();
}

function makeCallWith3SecondLatency(cb) {
console.log('mocking a call with 3 second latency...');
var mockResult = 'the result';
setTimeout(function() { cb(mockResult); }, 3000);
}

function doSomethingAsync(minDelay) {
return new Promise(function(resolve) {
var calledAt = getTimestamp();
makeCallWith3SecondLatency(function(arg) {
var actualDelay = getTimestamp() - calledAt;
if(actualDelay < minDelay) {
var artificialDelay = minDelay - actualDelay;
console.log('artificially delay another ' + artificialDelay + ' millis');
setTimeout(function() { resolve(arg); }, artificialDelay);
} else {
resolve(arg);
}
});
});
}

function printResult(result) {
console.log('result: ' + result)
}

var minDelay = 5000;
doSomethingAsync(minDelay).then(printResult);

很多样板文件。

然后我通过this answer发现了我可以使用 Promise.join 函数来加入 promise ,并用最少 5 秒延迟的 Promise.delay 包装请求以实现相同的目的:

fiddle here

function makeCallWith3SecondLatency(cb) {
console.log('mocking a call with 3 second latency...');
var mockResult = 'the result';
setTimeout(function() { cb(mockResult); }, 3000);
}

function doSomethingAsync(minDelay) {
return Promise.join(
new Promise(function(resolve) { makeCallWith3SecondLatency(resolve); }),
Promise.delay(minDelay).then(function() { console.log('artificially delaying 5 seconds with Promise.delay') }),
function(result) { return result; });
}

function printResult(result) {
console.log('result: ' + result)
}

var minDelay = 5000;
doSomethingAsync(minDelay).then(printResult);

这更干净,但仍然比我想要的样板多一点——我已经研究了 bluebird api reference并且找不到直接执行此操作的函数。

我的问题很简单 - 有谁能提出一种比第二个例子更简洁、更具声明性的方式来使用 bluebird 实现这种行为?

对于 API 确实提供此功能的其他 promise 库的任何建议,我们也将不胜感激。

最佳答案

我相信您需要做的就是Promise.delay(value).return(promise):

您可以将其包装在实用函数中:

function stallPromise(promise, delay) {
return Promise.delay(delay).return(promise);
}

function doSomethingAsync(minDelay) {
var p = new Promise(makeCallWith3SecondLatency);

return stallPromise(p, minDelay);
}

var minDelay = 5000;
doSomethingAsync(minDelay).then(printResult);

http://jsfiddle.net/s572rg7y/1/

请注意 与此相关的一件事是,如果 promise 拒绝,延迟的 promise 将在 5 秒过去后才会拒绝。这可能是理想的行为(正如@Benjamin Gruenbaum 在评论中指出的那样),但如果您希望它立即拒绝,另外两个选项是:

使用Promise.join:

function stallPromise(promise, delay) {
// if you're using underscore/lodash, you can use _.identity for this
function identity(val) { return val; }

return Promise.join(promise, Promise.delay(delay), identity);
}

或者@Benjamin Gruenbaum 使用 Promise.all 的方法:

function minDelay(promise, delay) {
Promise.all([promise, Promise.delay(delay)]).get(0);
}

关于javascript - 设置 bluebird.js promise 解析的最小延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28222439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com