Promise cache 链
Promise 常见的用法是 .then()
链式调用,其实.cache()
也是可以链式调用的。
首先初始化一个Promise.reject()
,之后需要重试几次就后面添加几个cache,如果需要满足一定条件或需要延迟一定时间还可与再继续添加.then(test).catch(rejectDelay);
const max = 5;
let p = Promise.reject();
const attempt = () => {
console.log(`attempt`)
return Promise.reject('error')
};
for(var i=0; i<max; i++) {
p = p.catch(attempt);
// 可以继续追加 then(test).catch(rejectDelay);
}
p.then(res => console.log(res)).catch(e => console.error(e));
这种方式需要保证:
- 只有在指定的最大重试次数下才有可能。(链的长度必须有限)
- 建议使用较小的重试次数。(Promise 链消耗的内存与其长度成正比)
如果不满足这几种情况,使用递归才是最好的选择。
递归
递归方式比较简洁,本质与Promise cache 链的实现是一样的,区别只是在失败之后才添加下一个catch链。
function retry(fn, retries=3, err=null) {
if (!retries) return Promise.reject(err);
return fn().catch(err => {
return retry(fn, (retries - 1), err,);
});
}