反复调用一个函数,直到它的承诺被解决,或者直到设置的超时时间过去
Calling a function repeatedly until its promise is resolved or until a set timeout has passed
我有一个导致很多错误的函数,所以我必须多次调用它才能最终给出正确的结果。它返回一个promise,所以我在它周围创建了一个包装器,在被拒绝时递归地不断调用它。
我想返回通过蓝鸟创建的新承诺,但在设置超时后必须拒绝。它必须不断地调用上面的函数。但是在每次重复之前,我想检查它是否由于超时而被自动拒绝。
Bluebird有一个isRejected()
方法,但似乎我不能从承诺体中使用它:
var promise = new Promise(function(resolve, reject){
var self = this;
setTimeout(reject, TIMEOUT*1000);
return doSomethingWrapper();
function doSomethingWrapper(){
if(promise.isRejected()) return;
// Error: Cannot read property 'isRejected' of undefined
if(self.isRejected()) return;
// Error: self.isRejected is not a function
return doSomething().then(resolve, doSomethingWrapper).catch(doSomethingWrapper);
}
});
还有其他解决方案吗?
创建超时承诺:
var timeout = Bluebird.delay(TIMEOUT * 1000).then(function () {
return Bluebird.reject(new Error("Timed out"));
});
创建操作承诺:
var something = (function doSomethingWrapper() {
if (timeout.isRejected()) {
return;
}
return doSomething().catch(doSomethingWrapper);
})();
种族:var promise = Bluebird.race(something, timeout);
这实际上可以用一种更简单的方式完成:
Promise.try(function doSomethingWrapper(){
return doSomething().catch(doSomethingWrapper); // retry
}).timeout(TIMEOUT * 1000);
不需要race:)
相关文章:
- 如何在解决承诺之前和之后验证值
- EmberJS:在成功处理请求时解决承诺
- 蓝鸟没有正确解决承诺
- 使用 $http.post 和 res.redirect,而不解决承诺
- 如何在解决承诺后从承诺对象获取值
- 在解决承诺 AngularJS/ES6 后检索存储在服务中的数据
- CSV 完成读取后,如何解决承诺
- 茉莉花间谍和解决承诺
- 如何在轮询时不断解决Q承诺
- 拒绝并解决Q承诺
- 基于另一个承诺解决承诺
- 立即解决承诺
- 通过离子/ui路由解决承诺
- 我可以选择只在if语句的一部分中解决承诺吗
- 开玩笑-在测试前解决承诺
- 多次解决承诺
- 让双方都期待解决承诺
- 问美元.所有这些都在解决承诺之前被调用
- 在angular中解决承诺
- Angularjs单元测试解决承诺