recursiveCall<T> function
Future<T>
recursiveCall<T>({
- required Future<
T> fn(), - required bool condition(
- T
- 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,
执行工厂函数 fn,重复创建新实例直到 condition 满足
fn 返回 Future 的工厂函数,每次重试都会重新调用
condition 满足条件,返回 true 时结束重试
maxRetry 最大重试次数
retryDelay 重试延迟(用于 RetryDelayStrategy.fixed 和 RetryDelayStrategy.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');
}