通过封装一个支持重试的 fetch 函数,利用递归调用或循环机制实现请求数据预重试策略。具体做法是定义一个配置对象,包含最大重试次数、初始延迟时间以及指数退避算法,在捕获到网络错误或特定 http 状态码时,等待一段时间后重新发起相同的请求,直到成功或达到最大重试上限。

如何根据 HTTP 状态码决定是否需要重试
判断是否重试的核心在于检查响应的 status 属性。通常将 5xx 系列错误(如 502, 503)视为服务器暂时不可用,适合触发重试;而 4xx 系列错误(如 401, 404)通常代表客户端请求有误,不应重试。代码中通过判断 response.status >= 500 来区分这两类情况,只有满足条件时才进入重试逻辑。

async function fetchWithRetry(url, options = {}, retries = 3, delay = 1000) {
let lastError;
for (let attempt = 0; attempt = 500 && attempt setTimeout(r, delay * Math.pow(2, attempt)));
continue;
}
throw new Error(`HTTP error! status: ${response.status}`);
} catch (error) {
lastError = error;
if (attempt setTimeout(r, delay * Math.pow(2, attempt)));
}
}
}
throw lastError;
}
如何处理网络异常与指数退避延迟
当发生网络断开或服务端无响应时,fetch 会抛出异常而非返回响应对象。此时需要捕获异常并计算下一次重试的等待时间。采用指数退避策略,即每次重试的等待时间是前一次的倍数,公式为 delay * 2^attempt。这能有效避免在服务器恢复期间产生过高的并发压力。代码中使用 setTimeout 配合 Promise 实现异步等待,确保重试过程不会阻塞主线程。

// 验证指数退避逻辑
const delays = [1000, 2000, 4000];
delays.forEach((d, i) => {
console.log(`Attempt ${i}: wait ${d}ms`);
});
// 输出:
// Attempt 0: wait 1000ms
// Attempt 1: wait 2000ms
// Attempt 2: wait 4000ms
基于最大重试次数耗尽后的最终结果处理
当重试次数全部用完仍未获得有效响应时,程序必须抛出最终的错误对象,以便调用方能感知请求失败。在上面的实现中,lastError 变量始终保存最近一次发生的错误。一旦循环结束,直接 throw lastError。这保证了无论是因为 HTTP 状态码不满足还是网络彻底中断,上层代码都能通过 try...catch 统一捕获并处理失败场景,例如显示用户友好的错误提示或记录日志。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











