Skip to content

retryWithBackoff

带退避策略的重试函数,失败后自动重试并逐渐增加等待时间。

函数签名

typescript
function retryWithBackoff<T>(
  fn: () => Promise<T>,
  options?: RetryOptions
): Promise<T>

interface RetryOptions {
  maxRetries?: number          // 最大重试次数,默认 3
  initialDelay?: number        // 初始延迟(毫秒),默认 1000
  maxDelay?: number            // 最大延迟(毫秒),默认 30000
  backoffFactor?: number       // 退避因子,默认 2
  onRetry?: (attempt: number, error: any) => void  // 重试回调
}

参数

参数名类型必填默认值说明
fn() => Promise<T>-要执行的异步函数
options.maxRetriesnumber3最大重试次数
options.initialDelaynumber1000初始延迟(毫秒)
options.maxDelaynumber30000最大延迟(毫秒)
options.backoffFactornumber2退避因子(延迟倍数)
options.onRetryfunction-重试时的回调函数

返回值

类型说明
Promise<T>Promise,成功时解析为函数结果,所有重试都失败时 reject

工作原理

  1. 首次尝试

    • 执行函数 fn()
    • 如果成功:返回结果
    • 如果失败:进入重试逻辑
  2. 重试循环(最多 maxRetries 次):

    • 计算当前延迟时间:
      • delay = initialDelay * (backoffFactor ^ attempt)
      • 限制在 maxDelay 以内
    • 调用 onRetry 回调(如果提供)
    • 等待延迟时间
    • 再次执行函数
    • 如果成功:返回结果并停止
    • 如果失败:继续下一次重试
  3. 所有重试失败

    • 抛出最后一次的错误

退避策略示例(initialDelay=1000, backoffFactor=2):

  • 第1次重试:等待 1秒
  • 第2次重试:等待 2秒
  • 第3次重试:等待 4秒
  • 第4次重试:等待 8秒

逐渐增加等待时间,避免在服务暂时不可用时过于频繁地重试。