recursiveCall<T> function

Future<T> recursiveCall<T>({
  1. required Future<T> fn(),
  2. required bool condition(
    1. T
    ),
  3. int maxRetry = 3,
  4. Duration retryDelay = const Duration(seconds: 1),
  5. Duration timeout = const Duration(seconds: 10),
  6. RetryDelayStrategy delayStrategy = RetryDelayStrategy.fixed,
  7. double delayFactor = 0.5,
  8. List<Duration> linearDelays = defaultLinearDelays,
})

执行工厂函数 fn,重复创建新实例直到 condition 满足 fn 返回 Future 的工厂函数,每次重试都会重新调用 condition 满足条件,返回 true 时结束重试 maxRetry 最大重试次数 retryDelay 重试延迟(用于 RetryDelayStrategy.fixedRetryDelayStrategy.exponential 的初始值) timeout 超时时间 delayStrategy 延迟策略,默认为 RetryDelayStrategy.fixed delayFactor 指数衰减的倍率因子(仅 RetryDelayStrategy.decay 生效),默认 0.5(每次减半) linearDelays 线性递增策略使用的延迟数组(仅 RetryDelayStrategy.linear 生效) 返回满足 condition 的结果

Implementation

Future<T> recursiveCall<T>({
  required Future<T> Function() fn,
  required bool Function(T) condition,
  int maxRetry = 3,
  Duration retryDelay = const Duration(seconds: 1),
  Duration timeout = const Duration(seconds: 10),
  RetryDelayStrategy delayStrategy = RetryDelayStrategy.fixed,
  double delayFactor = 0.5,
  List<Duration> linearDelays = defaultLinearDelays,
}) async {
  final start = DateTime.now();
  int attempt = 0;
  while (DateTime.now().difference(start) < timeout && attempt < maxRetry) {
    final result = await fn();
    if (condition(result)) {
      return result;
    }
    attempt++;
    if (attempt < maxRetry) {
      await Future.delayed(
        _computeDelay(
          attempt: attempt,
          baseDelay: retryDelay,
          strategy: delayStrategy,
          delayFactor: delayFactor,
          linearDelays: linearDelays,
        ),
      );
    }
  }
  throw Exception('Recursive call timed out or max retries exceeded');
}