指数退避通过延迟时间随失败次数指数增长(如100ms→200ms→400ms)缓解服务压力,公式为delay = base × 2^n + jitter,含随机抖动与最大延迟限制,并可封装为带重试逻辑的fetch函数。

在 JavaScript 的异步请求重发机制中引入指数退避,核心是让每次重试的等待时间随失败次数呈指数增长(如 100ms → 200ms → 400ms → 800ms),避免高频重试压垮服务或触发限流。
计算退避延迟时间
每次重试前,根据当前重试次数 n(从 0 开始)计算基础延迟:delay = base * 2^n + jitter
其中:
- base 是初始延迟(如 100)
- jitter 是随机偏移(如 0–100ms),用于分散并发请求峰值
- 最大延迟建议设上限(如 5s),防止等待过久
- 示例:base=100, n=0→100ms;n=1→200–300ms;n=2→400–500ms;n=3→800–900ms;n≥4 时 capped at 5000ms
封装带退避的 fetch 重试函数
用 async/await 封装可复用的请求函数,内部管理重试计数与延迟:
async function fetchWithBackoff(url, options = {}, { maxRetries = 3, baseDelay = 100 } = {}) {
for (let i = 0; i const delay = Math.min(baseDelay * Math.pow(2, i) + Math.random() * 100, 5000);
await new Promise(r => setTimeout(r, delay));
} }
配合 AbortController 实现超时与取消
指数退避期间若用户离开页面或主动取消,应中断后续重试:
- 每次重试前创建新的
AbortController,并传入signal到fetch - 在延迟
setTimeout中监听外部取消信号(如组件卸载) - 捕获
AbortError并提前退出重试循环
错误分类决定是否重试
不是所有错误都适合指数退避重试:
- 重试有意义:网络中断、5xx 服务端错误、429 限流响应
- 不应重试:400(客户端参数错)、401/403(鉴权失败)、404(资源不存在)
- 建议检查响应头
Retry-After,有则优先采用其建议延迟
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











