全局统一配置重试策略的核心是解耦策略与请求逻辑,通过不可变策略对象(含maxretries、basedelayms等字段)、可覆盖的requestwithretry执行器、运行时管理接口及日志可观测性实现标准化重试。

在 JavaScript 请求重试中,全局统一配置重试策略的关键是“解耦策略与请求逻辑”,让所有请求默认遵循一套可复用、可覆盖、可运行时调整的规则,而不是每个 fetch 或 axios 调用都重复写重试逻辑。
定义不可变的重试策略对象
策略应包含可读性强、语义明确的字段,且每次修改返回新对象(避免多请求共享状态):
- maxRetries:默认 2 次(即最多发起 3 次请求)
- baseDelayMs:初始延迟,如 100ms
- backoffFactor:退避倍数,通常为 2(实现指数增长)
- jitter:布尔值,启用后在延迟上叠加 ±25% 随机抖动
-
shouldRetry:函数,接收
error和response,返回true才重试。例如只重试TypeError、AbortError、状态码5xx或0(网络异常)
封装全局重试执行器
提供一个顶层函数(如 requestWithRetry),内部使用递归 Promise 或 for 循环 + await,自动应用当前全局策略:
- 每次请求前生成独立的
AbortController,防止取消信号污染其他请求 - 延迟计算公式:
delay = baseDelayMs * (backoffFactor ** attempt) * (jitter ? (0.75 + Math.random() * 0.5) : 1) - 失败时检查
shouldRetry(error, response),不满足则立即 reject - 支持传入局部策略对象,优先级高于全局策略(便于特殊接口临时覆盖)
提供运行时策略管理接口
暴露几个简洁方法,让团队可在任意时机动态调整行为:
-
setGlobalRetryPolicy(policy):替换全局默认策略(返回新策略对象) -
overridePolicy(urlPattern, policy):为匹配特定 URL 正则的请求指定专属策略(如 /payment/ 接口禁用重试) -
cancelAllPendingRetries():终止所有正在进行的重试链(基于内部维护的 AbortController 清单)
与请求库集成(以 fetch 为例)
可将全局重试能力注入标准 fetch,或封装成自定义 Hook(React)/Composable(Vue):
- 覆盖全局
window.fetch不推荐;更安全的是导出一个safeFetch函数,内部调用requestWithRetry - 在 Axios 中,可通过请求拦截器预设
config.retry = true,再配合响应拦截器触发重试逻辑 - 日志和可观测性需内置:每次重试前记录
[retry] ${url}, attempt ${n}/${max}, delay ${delay}ms
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











