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
 */

你可能感兴趣的:(前端)