重复调用一个函数,直到它的 promise 被 resolved 或直到设置的超时已经过去
Calling a function repeatedly until its promise is resolved or until a set timeout has passed
我有一个函数会导致很多错误,所以我必须多次调用它才能最终给出正确的结果。它 return 是一个承诺,所以我围绕它创建了一个包装器,在拒绝时递归地继续调用它。
我想 return new Promise created via Bluebird 但在设定的超时后必须拒绝。而且它必须不断重复调用上面的函数。但是在每次重复之前我想检查它是否由于超时而被自动拒绝。
Bluebird has a 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);
不需要比赛 :)
我有一个函数会导致很多错误,所以我必须多次调用它才能最终给出正确的结果。它 return 是一个承诺,所以我围绕它创建了一个包装器,在拒绝时递归地继续调用它。
我想 return new Promise created via Bluebird 但在设定的超时后必须拒绝。而且它必须不断重复调用上面的函数。但是在每次重复之前我想检查它是否由于超时而被自动拒绝。
Bluebird has a 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);
不需要比赛 :)