使用Promise解决失败重试的问题

136 阅读1分钟

需求

失败重试,200ms 试一次,500ms 试一次。还不成功就返回失败。

用例

测试用例:

const request = SuperRequest()
request('/test')
    .then(res => {
        console.log(res);
    })
    .catch(error => {
        console.error(error);
    })

调用api。使用随机数模拟调用api成功与失败的情况。

const fetch = (url) => {
    const { promise, resolve, reject } = Promise.withResolvers()
    setTimeout(() => {
        Math.random() > 0.2 ? reject(url) : resolve(url)
    }, 1000);
    return promise
}

实现

使用闭包实现,存储失败次数。循环调用_run函数,循环条件是满足失败条件,且调用接口返回失败的情况。

function SuperRequest() {
    let failedTime = 0
    const delayObj = {
        1: 200,
        2: 500
    }
    return (url) => {
        const { promise, resolve, reject } = Promise.withResolvers()
        function _run() {
            fetch(url)
                .then(res => resolve(`${res} success,failedTime: ${failedTime}`))
                .catch(error => {
                    if (failedTime > 2) {
                        reject(`${error} failed,failedTime: ${failedTime}`)
                    } else {
                        failedTime++
                        setTimeout(() => {
                            _run()
                        }, delayObj[failedTime]);
                    }
                })
        }
        _run()
        return promise
    }
}

测试数据展示:

截屏2024-06-05 23.27.18.png