反复调用一个函数,直到它的承诺被解决,或者直到设置的超时时间过去

Calling a function repeatedly until its promise is resolved or until a set timeout has passed

本文关键字:解决 承诺 或者 设置 过去 时间 超时 一个 函数 调用      更新时间:2023-09-26

我有一个导致很多错误的函数,所以我必须多次调用它才能最终给出正确的结果。它返回一个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:)