async/await重试函数需用try/catch捕获异常,通过循环+延迟实现重试,支持次数限制、条件判断(如仅重试5xx)、指数退避+jitter防雪崩,并可封装为高阶函数复用。

要编写支持重试机制的 async/await 异步包装函数,核心是用 try/catch 捕获失败,并在循环中按需重试,同时加入延迟和退出条件。
基础重试包装函数(带次数与延迟)
下面是一个通用、可复用的 retry 函数,接收一个异步操作、最大重试次数和每次失败后的等待毫秒数:
async function retry(fn, maxRetries = 3, delayMs = 1000) {
for (let i = 0; i setTimeout(resolve, delayMs));
}
}
}使用示例:
const fetchWithRetry = async (url) =>
retry(() => fetch(url).then(r => r.json()), 3, 2000);
<p>// 调用
try {
const data = await fetchWithRetry('<a href="https://www.php.cn/link/46b315dd44d174daf5617e22b3ac94ca">https://www.php.cn/link/46b315dd44d174daf5617e22b3ac94ca</a>');
console.log(data);
} catch (err) {
console.error('请求最终失败:', err.message);
}</p>支持自定义重试判断逻辑
有些错误不该重试(如 401、404),可扩展为只对特定错误类型或状态码重试:
async function retryIf(fn, shouldRetry, maxRetries = 3, delayMs = 1000) {
for (let i = 0; i setTimeout(resolve, delayMs));
}
}
}
<p>// 只对网络错误或 5xx 响应重试
const isTransientError = (err) => {
if (err.name === 'TypeError' && err.message.includes('fetch')) return true;
if (err.status && err.status >= 500 && err.status </p><p>await retryIf(
() => apiCall(),
isTransientError,
2,
500
);</p>支持指数退避与 jitter(防雪崩)
生产环境建议避免固定延迟,改用指数增长 + 随机抖动,防止大量请求在同一时刻重试:
- 第 1 次失败后等
1000ms,第 2 次等2000ms,第 3 次等4000ms - 加上 ±10% 的随机 jitter,让重试时间分散
function exponentialDelay(baseMs = 1000, attempt = 0, jitter = 0.1) {
const delay = baseMs * Math.pow(2, attempt);
const randomOffset = (Math.random() - 0.5) * 2 * jitter * delay;
return Math.max(100, delay + randomOffset); // 最少 100ms
}
<p>async function retryExponential(fn, maxRetries = 3, baseDelayMs = 1000) {
for (let i = 0; i setTimeout(resolve, delay));
}
}
}</p>封装成可复用的高阶函数(推荐)
把重试策略抽成配置对象,便于组合与复用:
function withRetry(options = {}) {
const {
maxRetries = 3,
baseDelay = 1000,
jitter = 0.1,
shouldRetry = () => true,
} = options;
<p>return function (fn) {
return async function (...args) {
for (let i = 0; i setTimeout(resolve, delay));
}
}
};
};
}</p><p>// 使用
const fetchJson = withRetry({ maxRetries: 2, baseDelay: 500 })(
async (url) => (await fetch(url)).json()
);</p><p>const data = await fetchJson('<a href="https://www.php.cn/link/46b315dd44d174daf5617e22b3ac94ca">https://www.php.cn/link/46b315dd44d174daf5617e22b3ac94ca</a>');</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











