递归配合 Promise 实现指定次数网络请求重试:定义异步函数接收 URL、选项、当前尝试次数和最大重试次数;请求失败且未达上限时,按指数退避延迟后递归重试;成功则返回响应,耗尽次数则抛出最终错误。

用递归配合 Promise 实现指定次数的网络请求重试,核心是:每次失败时判断剩余重试次数,若还有余量则延迟后重新调用自身;成功或重试耗尽时结束。
基础结构:递归函数封装请求逻辑
定义一个接受 URL、选项、当前重试次数(从 0 开始)和最大重试次数的异步函数。每次执行先发请求,捕获错误后决定是否重试。
- 用 fetch 发起请求,检查 response.ok 判断 HTTP 状态是否成功
- 网络异常(如断网)、5xx、4xx 都应进入 catch,统一按需重试
- 用 setTimeout + Promise 实现指数退避(可选),比如第 n 次重试等待 2ⁿ × 100ms
控制重试次数与终止条件
传入 maxRetries(如 3),初始 attempt = 0。每次失败后 attempt + 1,若 attempt >= maxRetries 就抛出最终错误,不再递归。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 成功时直接 return response 或 return response.json()
- 失败且未达上限时,计算延迟时间,用 new Promise(resolve => setTimeout(resolve, delay)) 等待后调用自身
- 注意避免无限递归:确保每次递归都推进 attempt,且有明确退出路径
完整可运行示例
// 使用 fetch + 递归 Promise 实现最多 3 次重试,带 200ms 起步的指数退避
async function requestWithRetry(url, options = {}, attempt = 0, maxRetries = 3) {
try {
const res = await fetch(url, options);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res;
} catch (err) {
if (attempt >= maxRetries) throw err;
<pre class="brush:php;toolbar:false;">const delay = Math.pow(2, attempt) * 100; // 100ms, 200ms, 400ms...
await new Promise(resolve => setTimeout(resolve, delay));
return requestWithRetry(url, options, attempt + 1, maxRetries);} }
// 调用 requestWithRetry('/api/data') .then(res => res.json()) .then(data => console.log(data)) .catch(err => console.error('最终失败:', err));
进阶建议:支持 AbortSignal 和自定义重试策略
生产环境建议增强健壮性:
- 在 fetch 中传入 AbortSignal.timeout(ms) 防止单次请求卡死
- 把重试逻辑抽成高阶函数,支持传入自定义判断函数(例如只对 500 重试,忽略 404)
- 记录每次重试状态(如 console.warn 或上报监控),便于排查

















