Axios全局自动重试需在响应拦截器错误分支实现,通过config.__retryCount控制次数,仅对超时、网络错误、408/429/503等重试,采用指数退避延迟,并支持配置开关。

在 Axios 拦截器中实现全局自动重试,核心是利用响应拦截器捕获失败请求(如网络错误、500、408、429 等),并基于条件重新发起原始请求,同时控制重试次数和延迟,避免无限循环或雪崩。
响应拦截器中实现重试逻辑
重试必须放在 response interceptor 的错误分支里(即 error 回调),不能在请求拦截器中做——因为此时请求还没发出去,也拿不到响应状态码和错误类型。
关键点:
- 用
config对象保存原始请求参数(Axios 会自动保留) - 通过
config.__retryCount或类似自定义字段记录已重试次数 - 只对特定错误码或网络异常重试(如
503、429、Network Error、timeout) - 用
setTimeout+Promise实现指数退避(如 100ms → 200ms → 400ms)
基础重试配置示例
以下代码在响应拦截器中完成三次重试,间隔递增:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
立即学习“Java免费学习笔记(深入)”;
let retryCount = 0;
const maxRetry = 3;
<p>axios.interceptors.response.use(
response => response,
error => {
const config = error.config;</p><pre class="brush:php;toolbar:false;">// 已超过最大重试次数,或不是可重试错误,直接 reject
if (!config || config.__retryCount >= maxRetry) {
return Promise.reject(error);
}
// 标记已重试一次
config.__retryCount = (config.__retryCount || 0) + 1;
// 判断是否值得重试:超时、网络错误、服务不可用、限流
const shouldRetry =
error.code === 'ECONNABORTED' || // timeout
error.code === 'ERR_NETWORK' || // 网络断开(Chrome 95+)
error.response?.status === 503 ||
error.response?.status === 429 ||
error.response?.status === 408;
if (!shouldRetry) {
return Promise.reject(error);
}
// 计算延迟(指数退避:100ms, 200ms, 400ms)
const delay = Math.pow(2, config.__retryCount - 1) * 100;
return new Promise(resolve => {
setTimeout(() => {
resolve(axios(config));
}, delay);
});} );
更健壮的写法:支持取消重复请求 & 避免拦截器嵌套问题
上面例子在并发请求多时可能有副作用。推荐封装成独立函数,并确保每次重试都生成新 Promise 链:
- 使用
axios.request(config)而非axios(config),更明确语义 - 把重试逻辑抽离为工具函数,便于单元测试和复用
- 避免在拦截器里直接修改原始
config(比如加 headers),否则重试会叠加 - 对
4xx错误要谨慎:除408、429外,多数4xx(如401、403)不应重试,而应走鉴权流程
配合请求拦截器做前置判断(可选)
如果需要统一添加重试策略开关(例如某些接口禁用重试),可在请求拦截器里设置标志:
axios.interceptors.request.use(config => {
// 全局默认开启重试
if (config.retry === undefined) {
config.retry = true;
}
// 或按 URL 白名单控制
if (config.url?.includes('/upload')) {
config.retry = false;
}
return config;
});然后在响应拦截器中检查 config.retry === false 就跳过重试逻辑。

















