我有一个导致很多错误的函数,因此我必须多次调用它才能最终得到正确的结果。它返回一个promise,所以我在它周围创建了一个包装器,它在拒绝时递归地调用它。
我想返回通过new Promise创建的Bluebird,但必须在设置超时后拒绝。它必须反复调用上面的函数。但在每次重复之前,我想检查它是否因超时而被自动拒绝。
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);
}
});
还有其他解决方案吗?
答案 0 :(得分:1)
创建超时承诺:
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);
答案 1 :(得分:1)
这实际上可以以更简单的方式完成:
Promise.try(function doSomethingWrapper(){
return doSomething().catch(doSomethingWrapper); // retry
}).timeout(TIMEOUT * 1000);
不需要比赛:)