【发布时间】:2015-08-10 14:24:50
【问题描述】:
我有一个函数downloadItem 可能由于网络原因而失败,我希望能够在实际拒绝该项目之前重试几次。重试需要超时,因为如果出现网络问题,立即重试是没有意义的。
这是我目前所拥有的:
function downloadItemWithRetryAndTimeout(url, retry, failedReason) {
return new Promise(function(resolve, reject) {
try {
if (retry < 0 && failedReason != null) reject(failedReason);
downloadItem(url);
resolve();
} catch (e) {
setTimeout(function() {
downloadItemWithRetryAndTimeout(url, retry - 1, e);
}, 1000);
}
});
}
显然,自从我第二次(以及第二次)调用downloadItemWithRetryAndTimeout 之后,这将失败,我没有按要求返回承诺。
如何使它与第二个承诺正常工作?
附:如果代码在 NodeJS 中运行很重要。
【问题讨论】:
-
也许使用 promise 不适合你的场景。我不明白为什么人们突然对每个异步案例都使用 Promise。
-
我不用promise,你有没有promise的解决方案?
-
@webduvet:因为这就是承诺的目的:具有单一结果的异步案例。它确实非常适合这种情况。
-
@AlexD:你的
downloadItem函数真的是同步的吗?我认为它应该返回一个承诺。 -
@alexd 与 Bluebird 您可以使用 Promise.delay 和 Promise.try
标签: javascript node.js promise settimeout