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.maxRetries | number | 否 | 3 | 最大重试次数 |
options.initialDelay | number | 否 | 1000 | 初始延迟(毫秒) |
options.maxDelay | number | 否 | 30000 | 最大延迟(毫秒) |
options.backoffFactor | number | 否 | 2 | 退避因子(延迟倍数) |
options.onRetry | function | 否 | - | 重试时的回调函数 |
返回值
| 类型 | 说明 |
|---|---|
Promise<T> | Promise,成功时解析为函数结果,所有重试都失败时 reject |
工作原理
首次尝试:
- 执行函数
fn() - 如果成功:返回结果
- 如果失败:进入重试逻辑
- 执行函数
重试循环(最多 maxRetries 次):
- 计算当前延迟时间:
delay = initialDelay * (backoffFactor ^ attempt)- 限制在 maxDelay 以内
- 调用
onRetry回调(如果提供) - 等待延迟时间
- 再次执行函数
- 如果成功:返回结果并停止
- 如果失败:继续下一次重试
- 计算当前延迟时间:
所有重试失败:
- 抛出最后一次的错误
退避策略示例(initialDelay=1000, backoffFactor=2):
- 第1次重试:等待 1秒
- 第2次重试:等待 2秒
- 第3次重试:等待 4秒
- 第4次重试:等待 8秒
逐渐增加等待时间,避免在服务暂时不可用时过于频繁地重试。