JS手写请求失败自动重连函数,支持自定义重连次数及重连延迟时间

447 阅读1分钟

实现这样一个需求:某个请求如果失败了,每隔两秒需要自动重连,重试三次后仍然失败则不再重试。该如何实现呢?

首先写一个函数模拟异步请求:

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)
})