重试执行异步函数
retry
函数签名
typescript
function retry<T>(fn: () => Promise<T>, retries: number, delay: number, shouldRetry?: (error: any, attempt: number) => boolean): Promise<T>描述
重试执行异步函数
类型参数
| 参数名 | 约束 | 默认值 | 描述 |
|---|---|---|---|
T | - | - | - 函数返回值类型 |
参数
| 参数名 | 类型 | 可选 | 默认值 | 描述 |
|---|---|---|---|---|
fn | () => Promise<T> | 否 | - | - |
retries | number | 否 | - | - |
delay | number | 否 | - | - |
shouldRetry | (error: any, attempt: number) => boolean | 是 | - | - |
返回值
Promise<T>
点击查看源码
js
/**
* 创建一个延迟执行的 Promise,用于在异步函数中暂停执行
*
* @param ms - 延迟的毫秒数,必须为非负整数
* @returns 返回一个在指定时间后 resolve 的 Promise<void>
*/
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
/**
* 重试执行异步函数
*
* @template T - 函数返回值类型
* @param {() => Promise<T>} fn - 要重试的异步函数
* @param {number} retries - 最大重试次数
* @param {number} delay - 重试间隔(毫秒)
* @param {(error: any, attempt: number) => boolean} [shouldRetry] - 判断是否应该重试的函数
* @returns {Promise<T>} 函数执行结果
*/
export async function retry(fn, retries, delay, shouldRetry) {
let lastError;
for (let attempt = 0; attempt <= retries; attempt++) {
try {
return await fn();
} catch (error) {
lastError = error;
if (
attempt < retries &&
(shouldRetry ? shouldRetry(error, attempt) : true)
) {
await sleep(delay);
continue;
}
break;
}
}
throw lastError;
}ts
/**
* 创建一个延迟执行的 Promise,用于在异步函数中暂停执行
*
* @param ms - 延迟的毫秒数,必须为非负整数
* @returns 返回一个在指定时间后 resolve 的 Promise<void>
*/
function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}
/**
* 重试执行异步函数
*
* @template T - 函数返回值类型
* @param {() => Promise<T>} fn - 要重试的异步函数
* @param {number} retries - 最大重试次数
* @param {number} delay - 重试间隔(毫秒)
* @param {(error: any, attempt: number) => boolean} [shouldRetry] - 判断是否应该重试的函数
* @returns {Promise<T>} 函数执行结果
*/
export async function retry<T>(
fn: () => Promise<T>,
retries: number,
delay: number,
shouldRetry?: (error: any, attempt: number) => boolean,
): Promise<T> {
let lastError: any;
for (let attempt = 0; attempt <= retries; attempt++) {
try {
return await fn();
} catch (error) {
lastError = error;
if (
attempt < retries &&
(shouldRetry ? shouldRetry(error, attempt) : true)
) {
await sleep(delay);
continue;
}
break;
}
}
throw lastError;
}如有错误,请提交issue :::