我使用 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/