Skip to content

@utilslib/core/retry


重试执行异步函数


retry

函数签名

typescript
function retry<T>(fn: () => Promise<T>, retries: number, delay: number, shouldRetry?: (error: any, attempt: number) => boolean): Promise<T>

描述

重试执行异步函数

类型参数

参数名约束默认值描述
T--- 函数返回值类型

参数

参数名类型可选默认值描述
fn() => Promise<T>--
retriesnumber--
delaynumber--
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 :::