题目描述:
手动实现 Promise.retry,成功后 resolve 结果,失败后重试,尝试超过一定次数才真正的 reject
Promise.retry = function (promiseFn, times = 3) {
return new Promise(async (resolve, reject) => {
while (times--) {
try {
var ret = await promiseFn();
resolve(ret);
break;
} catch (error) {
if (!times) reject(error);
}
}
});
};
function getProm() {
const n = Math.random();
return new Promise((resolve, reject) => {
setTimeout(() => n > 0.9 ? resolve(n) : reject(n), 1000);
});
}
Promise.retry(getProm);
看解析之前不妨自己思考怎么解,尽可能想到多的解法
Promise.retry = function(fn, num){
return new Promise(function(resolve, reject){
while(num>0){
try{
const res = await fn
resolve(res)
num = 0
} catch(e){
if(!num) reject(e)
}
num --
}
})
}
/**
* 实现 Promise.retry,成功后 resolve 结果,失败后重试,尝试超过一定次数才真正的 reject
*/
Promise.retry = function(fn, limit) {
let i = 0
return new Promise((resolve, reject) => {
function retry() {
console.log('try!', i)
fn().then(res => {
resolve()
}).catch(err => {
i++
if(i > limit - 1) {
reject(err)
} else {
retry()
}
})
}
retry()
})
}
Promise.retry(() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
Math.random() > .5 ? resolve() : reject()
}, 300);
})
}, 5).then(res => {
console.log('resolve')
}).catch(err => {
console.log('reject')
})
怎么样,你是否想到了更多更好的方法呢,可以一起讨论学习哦
扩展阅读: