实现这样一个需求:某个请求如果失败了,每隔两秒需要自动重连,重试三次后仍然失败则不再重试。该如何实现呢?
首先写一个函数模拟异步请求:
function request(){
const rate = 0.5;
return new Promise((resolve, reject)=>{
const result = Math.random();
setTimeout(()=>{
if(result >= rate){
resolve(result)
}else {
reject(result)
}
},100)
})
}
接下来实现重连函数:
function retry(fn, times, delay){
return new Promise((resolve, reject)=>{
// 为了方便后续重连时调用,可将fn重新封装
const inner = async function inner(){
try{
const res = await fn();
resolve(res)
}catch(e) {
if(times-- <= 0){ //重连次数耗尽,直接reject
reject(e)
}else {
console.log('开始重连,剩余次数:', times);
setTimeout(() => inner(), delay);
}
}
}
inner()
})
}
// 测试
retry(request, 3, 2000).then(res => {
console.log('成功', res)
}).catch(e => {
console.error('失败', e)
})