Promise实现请求重试的核心是捕获失败、判断重试条件、延迟后递归重发,直至成功或达最大次数;示例函数retryFetch支持自定义次数、延迟及错误过滤,推荐配合幂等设计与用户提示使用。

用 Promise 实现请求重试,核心是捕获失败、判断是否重试、延迟后重新发起请求,直到成功或达到最大重试次数。
基础结构:封装 fetch + 重试逻辑
把原始请求包装成一个返回 Promise 的函数,内部用递归或循环控制重试。推荐递归写法,清晰易懂:
- 每次失败时检查剩余重试次数,为 0 就直接 reject 错误
- 不为 0 则用 setTimeout 延迟(避免瞬间重试压垮服务),再调用自身
- 成功时直接 resolve 结果,不再继续
带延迟和次数限制的完整示例
下面是一个可直接使用的 retryFetch 函数:
function retryFetch(url, options = {}, maxRetries = 3, delayMs = 1000) {
return fetch(url, options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return response.json(); // 或 response.text() 等,按需调整
})
.catch(err => {
if (maxRetries <= 0) {
throw err;
}
return new Promise(resolve => {
setTimeout(() => {
resolve(retryFetch(url, options, maxRetries - 1, delayMs));
}, delayMs);
});
});
}
用法:
retryFetch('/api/data').then(data => console.log(data)).catch(err => console.error('最终失败:', err));
立即学习“Java免费学习笔记(深入)”;
更灵活的版本:支持自定义重试条件
有些错误不该重试(如 401、404),可以加判断逻辑:
- 在 catch 中检查 err 类型或 response.status
- 只对网络错误或 5xx 状态码重试
- 把重试策略(如指数退避)抽出来,delayMs 可改为 delayMs * 2
实际使用小提示
注意几点避免踩坑:
- 别在重试中重复发送 body(尤其是 POST),确保 options 是可复用的
- 前端重试不宜过多(一般 2–3 次足够),后端配合幂等设计更可靠
- 用户侧建议加 loading 状态和失败提示,避免“卡住”错觉


















