请求重试应使用async/await配合for循环实现串行执行,避免settimeout在同步循环中失效;需设最大重试次数、基础延迟及错误类型过滤,推荐封装为通用retry函数。

用循环加延时实现请求重试,核心是:捕获失败、控制重试次数、每次失败后等待再试。不能直接在 for 循环里写 setTimeout,因为它是异步的,会“跳过”等待;推荐用 async/await 配合 while 或 for 循环,让每次重试真正串行执行。
用 async/await + for 循环控制重试次数
这是最清晰、易理解的方式。定义最大重试次数和基础延迟时间,每次失败后增加延迟(可选指数退避),用 await 等待 setTimeout 完成。
示例:
async function fetchWithRetry(url, options = {}, maxRetries = 3, baseDelay = 1000) {
for (let i = 0; i setTimeout(resolve, delay));
}
}
}
调用方式:fetchWithRetry('/api/data').then(data => console.log(data)).catch(err => console.error(err));
用递归 + setTimeout 实现(适合不支持 async/await 的环境)
如果运行环境较老(如某些 Node.js 早期版本或需兼容 IE),可用递归函数模拟“等待后重试”,避免阻塞主线程。
示例:
function fetchWithRetryCB(url, options = {}, maxRetries = 3, baseDelay = 1000, attempt = 0) {
fetch(url, options)
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.then(data => {
// 成功,结束
console.log('Success:', data);
})
.catch(err => {
if (attempt {
fetchWithRetryCB(url, options, maxRetries, baseDelay, attempt + 1);
}, delay);
} else {
console.error('All retries failed:', err);
}
});
}
关键细节提醒
- 不要用同步循环+setTimeout:for 循环本身不会等待 setTimeout,所有请求会立刻发出,达不到“重试”效果
- 区分错误类型:网络中断、超时、500 错误值得重试;400、401、404 通常不该重试,可在 catch 中判断 err.name 或状态码做过滤
- 避免无限重试:必须设 maxRetries 上限,否则可能卡死或触发服务限流
- 注意浏览器限制:频繁请求可能被节流,延时不宜过短;长时间重试建议加用户提示(如“正在重试…”)
简单封装成可复用的工具函数
把重试逻辑抽出来,支持传入任意异步函数(不只是 fetch),更通用:
async function retry(fn, maxRetries = 3, baseDelay = 1000) {
for (let i = 0; i setTimeout(r, baseDelay * Math.pow(2, i)));
}
}
}
<p>// 使用
retry(() => fetch('/api/data').then(r => r.json()))
.then(data => console.log(data))
.catch(err => console.error(err));</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











