javascript - NodeJS promise 不重置

标签 javascript node.js es6-promise

我使用 Promise 在 API 请求失败时重试它们。我这样使用它:

var promise = new Promise((resolve, reject) => {
    client.ApiRequest(params, function(data) {
        if (!Array.isArray(data)) {
            console.log("There was an error with the request.");
            reject("Rate Limit Exceeded");
            return;
        }
        ...
        resolve();
    });
});
Utils.retry(promise, 1500);

然后Utils.retry方法如下:

static delay(delayMS) {
    return new Promise(function(resolve, reject){
        setTimeout(resolve, delayMS);
    });
}

static retry(operation, delayMS) {
    return operation.catch((err) => {
        console.log(err);
        return Utils.delay(delayMS).then(function(){
            return Utils.retry(operation, delayMS)
        });
    });
}

如您所见,它从 Promise 中捕获 reject() 并使用 delay() 在重试之前等待。代码运行了,但是好像一旦promise失败了,就一直卡在rejected状态。

例如,当它失败时,它会延迟,然后重试 Promise,只是输出相同的拒绝消息。但是,在第一个函数中,它不会在后续重试时打印出“请求有错误”消息,因此我认为它甚至没有重试。

有没有办法重置此 Promise 状态,以便在重试时执行 Promise 函数中的所有代码?

最佳答案

不要传递对原始 Promise 的引用。 每次传递一个新的 Promise。以下是您可以执行此操作的方法。

// a function that returns a new promise
var createPromise = function() {
    return new Promise((resolve, reject) => {
        client.ApiRequest(params, function(data) {
            if (!Array.isArray(data)) {
                console.log("There was an error with the request.");
                reject("Rate Limit Exceeded");
                return;
            }
            ...
            resolve();
        });
    });
}    

-

static delay(delayMS) {
    return new Promise(function(resolve, reject){
        setTimeout(resolve, delayMS);
    });
}

static retry(operation, delayMS) {
    return operation().catch((err) => { //invoke the promise function
        console.log(err);
        return Utils.delay(delayMS).then(function(){
            return Utils.retry(operation, delayMS)
        });
    });
}

Utils.retry(promise, 1500);

关于javascript - NodeJS promise 不重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47877417/

相关文章:

javascript - Nodejs 从数组表达流

javascript - 如何在 Node.js 中处理媒体流?

node.js - node-mongodb-native 周围的最小层

ajax - 将 View 渲染到 ExpressJS 中的变量中(用于 AJAX 响应)

javascript - 会在promise循环中解决break循环迭代吗?

javascript - 从慢速 api 中获取图像

javascript - setTimeout 函数,以 Promise 解析值作为回调

javascript - Bootstrap 3 轮播的问题

javascript - RaphaelJS/Javascript 更新路径而不是创建新路径

javascript - 如何从排序函数中返回未排序的项目?