/**
* 实现 Promise.retry , 重试异步函数
* 失败后重试, 尝试指定次数后 抛出异常, reject
*/
function fn() {
const num = Math.random();
return new Promise((resolve, reject) => {
setTimeout(() => {
if (num > 0.7) {
resolve(num);
} else {
reject(num);
}
}, num * 2000)
})
}
Promise.retry = (fn, times) => {
let total = times;
new Promise(async (resolve, reject) => {
while (total--) {
try {
const res = await fn();
console.log('执行成功,结果为:', res);
resolve(res);
break;
} catch (err) {
// 到达指定times结束循环
if (!total) {
reject(err);
}
}
}
}).catch(() => {
console.log('执行完成,' + times + '次全部失败...');
})
}
Promise.retry(fn, 7);
12 天前