当前位置: 首页 > news >正文

Axios请求超时重发机制

Axios 超时重新请求实现方案

在 Axios 中实现超时重新请求可以通过以下几种方式:

1. 使用拦截器实现自动重试

import axios from 'axios';// 创建axios实例
const instance = axios.create();// 设置超时时间
instance.defaults.timeout = 5000;// 最大重试次数
const MAX_RETRY = 3;// 添加请求拦截器
instance.interceptors.response.use(undefined, (error) => {const config = error.config;// 如果配置不存在或未设置重试选项,则拒绝if (!config || !config.retry) return Promise.reject(error);// 设置重试次数变量config.__retryCount = config.__retryCount || 0;// 检查是否已达到最大重试次数if (config.__retryCount >= config.retry) {return Promise.reject(error);}// 增加重试计数器config.__retryCount += 1;// 创建新的Promise来处理指数退避const backoff = new Promise((resolve) => {setTimeout(() => {resolve();}, config.retryDelay || 1000);});// 返回Promise,在退避时间后重试请求return backoff.then(() => instance(config));
});// 使用示例
instance.get('/api/data', {retry: MAX_RETRY, // 重试次数retryDelay: 1000 // 重试延迟时间(毫秒)
}).then(response => {console.log(response.data);
}).catch(error => {console.error('请求失败:', error);
});

2. 封装请求函数实现重试

function requestWithRetry(url, options = {}, retryCount = 3) {return new Promise((resolve, reject) => {const attempt = (currentRetry) => {axios({url,...options,timeout: options.timeout || 5000}).then(resolve).catch((error) => {if (currentRetry <= 0 || !isRetryable(error)) {return reject(error);}console.log(`请求失败,剩余重试次数: ${currentRetry - 1}`);// 指数退避const delay = Math.pow(2, retryCount - currentRetry) * 1000;setTimeout(() => {attempt(currentRetry - 1);}, delay);});};attempt(retryCount);});
}// 判断错误是否可重试
function isRetryable(error) {return (error.code === 'ECONNABORTED' || // 超时!error.response || // 无响应(网络错误)error.response.status >= 500 // 服务器错误);
}// 使用示例
requestWithRetry('/api/data', { method: 'get' }, 3).then(response => console.log(response.data)).catch(error => console.error('最终失败:', error));

3. 使用第三方库

也可以使用专门处理重试的库,如 axios-retry:

import axios from 'axios';
import axiosRetry from 'axios-retry';// 配置axios-retry
axiosRetry(axios, {retries: 3, // 重试次数retryDelay: (retryCount) => {return retryCount * 1000; // 重试延迟},retryCondition: (error) => {// 只在超时或5xx错误时重试return axiosRetry.isNetworkOrIdempotentRequestError(error) || error.code === 'ECONNABORTED';}
});// 正常使用axios
axios.get('/api/data', { timeout: 5000 }).then(response => console.log(response.data)).catch(error => console.error('请求失败:', error));

注意事项

  1. 幂等性:确保请求是幂等的(GET、HEAD、OPTIONS、PUT、DELETE等),POST请求重试可能导致重复操作
  2. 退避策略:建议使用指数退避策略,避免同时重试大量请求
  3. 用户体验:对于前端应用,应考虑用户等待时间,不宜设置过多重试次数
  4. 取消请求:如果用户导航离开页面,应取消未完成的请求

以上方案可以根据实际需求进行调整和组合使用。

http://www.xdnf.cn/news/898813.html

相关文章:

  • 亚矩阵云手机实测体验:稳定流畅背后的技术逻辑​
  • 面向无人机海岸带生态系统监测的语义分割基准数据集
  • Cursor 1.0正式推出:全面解析你的AI 编程助手
  • 湖北理元理律师事务所:企业债务重组的风险控制方法论
  • 办公提效的AI免费工具使用感悟
  • 大量企业系统超龄服役!R²AIN SUITE 一体化企业提效解决方案重构零售数智化基因
  • Inxpect安全雷达传感器与控制器:动态检测 + 抗干扰技术重构工业安全防护体系
  • 从“人找政策”到“政策找人”:智能退税ERP数字化重构外贸生态
  • 如何以 9 种方式将照片从手机传输到笔记本电脑
  • 手机如何防止ip关联?3种低成本方案
  • 23套橙色系精选各行业PPT模版分享
  • 【前端】每日一道面试题6:解释Promise.any和Promise.allSettled的使用场景及区别。
  • 安装VUE客户端@vue/cli报错警告npm WARN deprecated解决方法 无法将“vue”项识别为 cmdlet、函数
  • 智能对联网页小程序的仓颉之旅
  • 2018~2025:英伟达在具身智能机器人领域的关键布局详解
  • 探索 Java 垃圾收集:对象存活判定、回收流程与内存策略
  • 学习笔记(26):线性代数-张量的降维求和,简单示例
  • Komiko 视频到视频功能炸裂上线!
  • uniapp 集成腾讯云 IM 消息搜索功能
  • python中的经典视觉模块:OpenCV(cv2)全面解析
  • 【PDF PicKiller】PDF批量删除固定位置图片工具,默认解密,可去一般图、背景图、水印图!
  • Excel处理控件Aspose.Cells教程:使用 C# 在 Excel 中创建组合图表
  • 消防一体化安全管控平台:构建消防“一张图”和APP统一管理
  • App/uni-app 离线本地存储方案有哪些?最推荐的是哪种方案?
  • 【nano与Vim】常用命令
  • Python----目标检测(YOLO简介)
  • AI生成的基于html+marked.js实现的Markdown转html工具,离线使用,可实时预览 [
  • NTT印地赛车:数字孪生技术重构赛事体验范式,驱动观众参与度革命
  • npm error Cannot read properties of null (reading ‘matches‘)
  • Vue 组件库发布实战(含 TypeScript 支持)