需求
失败重试,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
}
}
测试数据展示: