- 核心思想就是利用Promise.race() ,让请求时间与计时器时间竞赛,超时时计时器reject()。
- 然后用catch捕获这个reject,catch里面重新执行这次请求,一直到请求成功为止,也就是请求花费时间小于计数器时间为止。
function retry(fn, delay) {
return new Promise((resolve, reject) => {
Promise.race([fn(), timeOut(delay)]).then(res => {
resolve(res);
}).catch(err => {
reject("race 内部超时")
})
}).catch(err => {
console.log(err);
return retry(fn, delay)
})
}
const timeOut = (delay) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(false);
}, delay);
})
}
const test = function () {
const delay = Math.floor(Math.random() * 10000);
console.log(`本次请求花费:${delay}ms`);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1234)
}, delay);
})
}
retry(test, 2000).then(res => {
console.log("res->", res);
})