使用axios.all批量请求时,如何重试失败的特定请求?
批量请求失败重试方案(针对403等特定错误)
核心思路
- 给单个请求添加针对性重试逻辑,仅在返回403等指定错误时触发
- 重试延迟设为10分钟,通过Promise结合setTimeout实现异步等待
- 每个请求独立处理重试流程,不影响其他并行请求的正常执行
修改后的完整代码
class Service { // 带重试逻辑的请求方法,默认10分钟延迟 async getElementWithRetry(current, retryDelay = 10 * 60 * 1000) { try { // 修复原URL的语法错误(多余的闭合大括号) const res = await axiosInstance.get(`/api/${current}/`); return res; } catch (e) { // 仅对403错误执行重试 if (e.response?.status === 403) { // 等待指定延迟后递归重试 await new Promise(resolve => setTimeout(resolve, retryDelay)); return this.getElementWithRetry(current, retryDelay); } // 其他错误返回约定的失败结构 return { el: null }; } } } // 生成批量请求Promise数组 const getElementPromises = array.map(item => { const service = new Service(); return service.getElementWithRetry(item) .then(result => { // 统一处理失败结果格式 if (!result || result.el === null) { return { ref: null }; } return result; }); }); let ElementContent = []; try { // 等待所有请求(含重试完成的请求)返回结果 const responses = await Promise.all(getElementPromises); ElementContent = JSON.stringify(responses); } catch (err) { console.log('全局请求异常:', err); }
关键说明
- 错误修正:修复了原代码中URL的语法错误(多余的
}),避免无效请求 - 重试触发控制:仅捕获HTTP状态码为403的错误进行重试,其他错误直接返回失败结果
- 异步延迟实现:用
new Promise封装setTimeout,确保await能正确等待延迟时间 - 独立重试流程:每个请求的重试逻辑完全独立,不会阻塞其他并行请求,Promise.all会等待所有请求(包括重试完成的)结束
- 结果格式统一:保持原代码中对失败结果的格式约定,返回
{ ref: null }
可选优化
- 限制重试次数:可添加
maxRetries参数,每次重试递减,达到上限后停止重试返回失败 - 指数退避策略:将固定延迟改为递增延迟(如第一次10分钟,第二次20分钟),降低服务器压力
- 超时配置:确保axiosInstance的超时时间足够长,避免重试请求还未发起就超时
内容的提问来源于stack exchange,提问作者Tarik
相关产品推荐
相关产品推荐

