You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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);
}

关键说明

  1. 错误修正:修复了原代码中URL的语法错误(多余的}),避免无效请求
  2. 重试触发控制:仅捕获HTTP状态码为403的错误进行重试,其他错误直接返回失败结果
  3. 异步延迟实现:用new Promise封装setTimeout,确保await能正确等待延迟时间
  4. 独立重试流程:每个请求的重试逻辑完全独立,不会阻塞其他并行请求,Promise.all会等待所有请求(包括重试完成的)结束
  5. 结果格式统一:保持原代码中对失败结果的格式约定,返回{ ref: null }

可选优化

  • 限制重试次数:可添加maxRetries参数,每次重试递减,达到上限后停止重试返回失败
  • 指数退避策略:将固定延迟改为递增延迟(如第一次10分钟,第二次20分钟),降低服务器压力
  • 超时配置:确保axiosInstance的超时时间足够长,避免重试请求还未发起就超时

内容的提问来源于stack exchange,提问作者Tarik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:22:52