bolawen
2024年04月09日
一、认识
请求重试, 实现了对任务的重试逻辑(默认重试 3
次), 并加入指数退避, 每次重试等待更长时间, 以降低连续重试带来的压力
二、实现
function request() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject("ok");
}, 3000);
});
}
function wait(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function requestWithRetry(data, retries = 3) {
return new Promise((resolve, reject) => {
function attempt(remaining) {
request(data)
.then(resolve)
.catch(async (err) => {
if (remaining > 0) {
await wait(1000 * (retries - remaining + 1));
console.log(
`⚠️ 任务 ${data} 失败,正在重试 (${
retries - remaining + 1
}/${retries})...`
);
attempt(remaining - 1);
} else {
reject(err);
}
});
}
attempt(retries);
});
}
三、测试
requestWithRetry(3, 500)
.then(res => {
console.log('res', res);
})
.catch(error => {
console.log('error', error);
});