重复调用函数,直到其promise被解决或者直到设置超时为止

时间:2015-08-24 01:49:43

标签: javascript node.js promise bluebird

我有一个导致很多错误的函数,因此我必须多次调用它才能最终得到正确的结果。它返回一个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);
    }
});

还有其他解决方案吗?

2 个答案:

答案 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);

不需要比赛:)