递归重试函数通过异步递归(Promise+setTimeout)实现,控制最大重试次数与延迟,终止于成功、次数耗尽或不可重试错误;推荐指数退避与错误分类过滤以提升鲁棒性。

用递归函数实现请求重试,核心是:失败时调用自身,并控制重试次数和延迟,避免无限循环或频繁冲击服务。
基础结构:带次数限制的递归重试
每次请求失败后,若还有剩余重试次数,就延迟一段时间再发起下一次请求;成功或次数用尽则结束递归。
- 用一个 count 参数记录当前已尝试次数(或剩余次数)
- 用 setTimeout 控制重试间隔,避免阻塞和瞬间重发
- 必须有明确的终止条件:请求成功、达到最大重试次数、或遇到不可重试错误(如 401、403)
示例代码:fetch 请求 + 最多重试 3 次
以下是一个简洁可用的实现:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function retryFetch(url, options = {}, maxRetries = 3, currentTry = 1) {
return fetch(url, options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return response.json(); // 或 response.text() 等
})
.catch(error => {
if (currentTry >= maxRetries) {
throw error; // 耗尽重试,抛出最终错误
}
// 延迟 1 秒后重试(可按需指数退避)
return new Promise(resolve =>
setTimeout(() => resolve(), 1000)
).then(() => retryFetch(url, options, maxRetries, currentTry + 1));
});
}
<p>// 使用方式
retryFetch('/api/data')
.then(data => console.log('成功:', data))
.catch(err => console.error('彻底失败:', err));
进阶建议:加入指数退避和错误过滤
生产环境推荐增强鲁棒性:
立即学习“Java免费学习笔记(深入)”;
-
指数退避:延迟时间随重试次数增长(如 1s → 2s → 4s),减少服务压力。可用
Math.pow(2, currentTry) * 1000 - 只重试特定错误:网络中断、500、502、503、504 可重试;400、401、403、404 通常不重试
- 取消机制(可选):配合 AbortController,在重试中途主动中止(需在每次 fetch 中传入 signal)
注意事项
递归本身不会导致栈溢出(因为用了 Promise + setTimeout,是异步递归),但仍需注意:
- 避免在同步逻辑中写无终止条件的递归(会爆栈)
- 不要把重试逻辑硬编码在业务函数里,建议封装成通用工具函数
- 考虑加上日志输出(如 “第 2 次重试…”),便于排查问题

















