await 本身不自动重试,需手动封装重试逻辑:用 try/catch + 循环控制次数与延迟,区分错误类型,支持指数退避、日志记录;可用 p-retry 等库简化,但须注意幂等性、错误过滤和超时限制。

在 JavaScript 中,await 本身不会自动重试失败的请求,但你可以通过封装一个带重试逻辑的异步函数来实现——核心是捕获异常、判断是否可重试、控制重试次数和延迟。
用 try/catch + 循环手动实现重试
最直接的方式是在 async 函数中用 for 或 while 循环包裹 await,配合 try/catch 捕获错误,并在失败时等待后继续下一次尝试:
- 设定最大重试次数(如 3 次),初始尝试算第 1 次,最多共请求 4 次
- 每次失败后用
await new Promise(r => setTimeout(r, delay))延迟再试 - 对特定错误类型(如网络超时、502/503)重试,对 401、404 等客户端错误通常不重试
示例代码:
async function fetchWithRetry(url, options = {}, maxRetries = 3, baseDelay = 1000) {
for (let i = 0; i <= maxRetries; i++) {
try {
const res = await fetch(url, options);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
if (i === maxRetries) throw err;
const delay = baseDelay * Math.pow(2, i); // 指数退避
await new Promise(r => setTimeout(r, delay));
}
}
}封装成可复用的高阶函数
把重试逻辑抽离为通用工具函数,能提升复用性。接收一个返回 Promise 的函数(如 fetch 调用),返回一个带重试能力的新函数:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 支持传入自定义重试条件(例如只重试
TypeError或状态码为 5xx 的响应) - 支持指数退避(delay × 2ⁿ)或固定延迟
- 可选记录重试日志,方便调试
使用第三方库简化开发(如 p-retry)
如果项目允许引入依赖,p-retry 是轻量可靠的方案:
- 一行代码启用重试:
await pRetry(() => fetch('/api/data').then(r => r.json()), { retries: 3 }) - 内置错误过滤(
retryIf)、自定义延迟(minTimeout,maxTimeout)、钩子(onFailedAttempt) - 避免重复造轮子,且经过大量生产验证
注意边界情况和最佳实践
重试不是万能的,滥用反而加重服务压力或掩盖真实问题:
- 幂等性很重要:确保重试的请求是安全的(如 GET、带幂等 ID 的 POST),避免重复下单、扣款
- 不要无差别重试所有错误,比如认证失败(401)、参数错误(400)应直接抛出
- 设置合理的最大重试次数(通常 2~3 次)和总超时时间(如整个请求不超过 10 秒)
- 前端重试不能替代服务端容错,关键链路建议后端也做重试或降级

















