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

如何在Promise封装的$.ajax请求中实现失败重试N次后再抛出错误

$.ajax 自动重试逻辑实现

核心逻辑是在原有Promise封装的基础上,新增重试计数维护,请求触发error回调时优先判断剩余重试额度,未达上限则重新发起请求,仅当重试次数耗尽时才执行reject抛出错误。

实现要点

  • 支持自定义最大重试次数、重试间隔,默认配置可直接使用
  • 重试逻辑内部递归发起请求,自动维护剩余重试次数
  • 成功时正常返回配置数据,无多余逻辑侵入
  • 仅所有重试全部失败后才向外抛出错误,符合预期行为

改造后完整代码

const self = {
  /**
   * 获取预认证配置
   * @param {Object} data 接口请求参数
   * @param {Number} maxRetries 最大重试次数,默认3次
   * @param {Number} retryDelay 重试间隔(毫秒),默认1000ms
   * @returns {Promise} 接口返回的配置数据
   */
  fetchPreAuthnConfig: (data, maxRetries = 3, retryDelay = 1000) => {
    // 封装单次请求逻辑,入参为当前剩余可重试次数
    const sendRequest = (remainingRetries) => {
      return new Promise((resolve, reject) => {
        $.ajax({
          url: preAuthnEndpoint,
          type: 'POST',
          contentType: 'application/json',
          dataType: 'json',
          data: JSON.stringify(data),
          success: ({ configurations }) => {
            resolve(configurations);
          },
          error: (error) => {
            // 仍有重试次数时,延迟后重新发起请求
            if (remainingRetries > 0) {
              setTimeout(() => {
                resolve(sendRequest(remainingRetries - 1));
              }, retryDelay);
              return;
            }
            // 重试次数耗尽,抛出错误
            reject(error);
          },
        });
      });
    };

    // 首次发起请求,传入初始最大重试次数
    return sendRequest(maxRetries);
  },
}

调用方式

  • 默认配置调用(最多重试3次,间隔1秒):
self.fetchPreAuthnConfig(requestData)
  .then(config => {
    // 处理正常返回的配置
  })
  .catch(err => {
    // 所有重试都失败后才会进入这里处理错误
  });
  • 自定义重试规则调用(比如最多重试5次,间隔500毫秒):
self.fetchPreAuthnConfig(requestData, 5, 500)

可选优化

可以在错误回调中增加错误类型判断,对于客户端参数错误、权限不足这类重试无法解决的问题,直接抛出错误不消耗重试次数,只对网络异常、服务端5xx类错误触发重试,示例:

error: (error) => {
  // 4xx类客户端错误直接抛错,不触发重试
  if (error.status >= 400 && error.status < 500) {
    reject(error);
    return;
  }
  // 其余错误走原有重试逻辑
  if (remainingRetries > 0) {
    setTimeout(() => {
      resolve(sendRequest(remainingRetries - 1));
    }, retryDelay);
    return;
  }
  reject(error);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:39:29