【发布时间】:2017-01-18 23:12:06
【问题描述】:
我一直在尝试找出如何最好地实现重试,例如使用 Promise 下载失败。我最好的猜测是用一个新的 Promise 来解决一个 Promise(见下面的伪代码),但我在文档中只能找到 Promise.resolve() 可以用 thenable 调用(所以,我相信,用 Promise )。这是否也适用于 promise 构造函数中的解析回调?我的方法是正确的还是有更好的方法来实现重试?
function getdata(url) {
return new Promise(function(resolve, reject) {
ajaxcall({
url: url,
success: function(data) { resolve(data); },
failure: function(err) {
if(retriable(err)) {
resolve(getdata(url));
}
else {
reject(err);
}
}
});
});
}
【问题讨论】:
-
这很容易找到:
new Promise(resolve => resolve(Promise.resolve(42))).then(v => console.log(v));记录42,而不是承诺。所以是的,它似乎也适用于resolve。 -
通用承诺重试助手
var retry = fn => _ => fn().catch(retry(fn)); -
通用限制承诺重试次数
var retryP = (fn, retry) => fn().catch(err => retry > 0 ? retryP(fn, retry - 1) : Promise.reject(err));
标签: javascript node.js ecmascript-6 promise es6-promise