如何在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
相关产品推荐
相关产品推荐

