问题描述
使用Promise封装异步请求数据时,当请求失败,可重试指定次数,最好封装一个retry(fun:Promise, times:Number)
的重试工具函数
方法实现
function retry(fn, times){
return new Promise((resolve, reject)=>{
function run(){
fn().then(resolve).catch(err=>{
if(times--){
console.log(`还有 ${times} 次尝试`)
run()
}else{
reject(err)
}
})
}
run()
})
}
测试样例
// 每隔一秒生成一个随机数,大于0.9才resolve
function retryDemo(){
return new Promise((resolve, reject)=>{
let r = Math.random()
setTimeout(()=>{
console.log(r)
if(r>0.9){
resolve(r)
}else{
reject('error:'+r)
}
}, 1000)
})
}
// 使用重试函数
retry(retryDemo, 5).then(res=>{
console.log('成功:'+ res)
}).catch(err=>{
console.log(err)
})
/**
* 打印结果如下,5次都失败则打印error
0.13828016742576854
VM642:6 还有 4 次尝试
VM642:21 0.44909079753721226
VM642:6 还有 3 次尝试
VM642:21 0.03058115685015439
VM642:6 还有 2 次尝试
VM642:21 0.29728641790549015
VM642:6 还有 1 次尝试
VM642:21 0.9243906323866069
VM725:2 成功:0.9243906323866069
*/
![](http://muchstudy.com/2020/04/04/%E8%81%8A%E8%81%8A%E4%B8%80%E7%BA%BF%E5%BC%80%E5%8F%91%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%B4%A0%E5%85%BB/%E5%85%AC%E4%BC%97%E5%8F%B7%E4%BA%8C%E7%BB%B4%E7%A0%81.gif)