在 async 函数中实现异步请求统一重试,需封装高阶 retry 函数,支持配置重试次数、指数退避+抖动、AbortSignal 取消及按错误类型(如网络异常、5xx)精准重试,避免盲目重试 4xx 等业务错误。

在 async 函数中实现异步请求的统一重试逻辑,核心是封装一个可复用的 retry 包装器,而不是在每个请求里重复写重试代码。关键点在于:控制重试次数、处理失败间隔、区分可重试错误、避免无限循环。
用高阶函数封装 retry 逻辑
把重试逻辑抽成独立函数,接收原始异步操作和重试配置,返回一个新的 Promise:
- 接受一个异步函数(如 fetch 或 axios 调用)作为参数
- 支持配置最大重试次数、基础延迟、是否指数退避
- 只对特定错误类型重试(比如网络错误、502/503,而非 401 或 404)
判断哪些错误值得重试
盲目重试所有错误会掩盖业务问题。建议按错误类型做筛选:
- 网络异常(TypeError: failed to fetch)、AbortError 可重试
- HTTP 状态码 5xx、超时响应(如 status === 0)可重试
- 4xx 错误一般不重试(除 408 Request Timeout 外)
- 可在 retry 函数里加 predicate 判断:例如 err?.response?.status >= 500
加入退避策略和取消机制
连续重试可能压垮服务或客户端。推荐用指数退避 + 随机抖动:
- 第 n 次重试延迟 = baseDelay * 2ⁿ + jitter(jitter 是 0~100ms 随机值)
- 支持 AbortSignal:调用时传入 signal,任意一次重试中检测 signal.aborted 就立即 reject
- 避免在重试中累积未清理的定时器,每次重试前清除上一轮 timer
直接集成到业务 async 函数中
不需要改原有请求逻辑,只需包一层:
- const data = await retry(() => api.getUser(id), { retries: 3 });
- 如果用 TypeScript,可以给 retry 加泛型,保持返回类型推导准确
- 配合 try/catch 使用:外层 catch 捕获最终失败,内部重试静默进行

















