Promise重试功能实现

问题描述

使用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
 */
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值