重复调用一个函数,直到它的 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);

不需要比赛 :)