You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按顺序链式调用多个Future并添加whenComplete处理器

实现Future列表的顺序执行及全局whenComplete处理

你需要按顺序执行异步请求(替代并行的Future.wait),同时添加全局的whenComplete处理器,以下是具体实现方案:

方案1:为List扩展waitInOrder方法

通过扩展方法给Future列表添加顺序执行能力,支持传入全局完成回调:

extension FutureListExtension<T> on List<Future<T>> {
  Future<void> waitInOrder({void Function()? whenComplete}) async {
    for (final future in this) {
      // 逐个等待每个Future完成,确保严格顺序执行
      await future;
    }
    // 所有Future处理完毕后触发回调
    whenComplete?.call();
  }
}

方案2:独立工具函数

如果不想使用扩展方法,也可以编写独立的工具函数:

Future<void> executeFuturesSequentially(List<Future<void>> futures, {void Function()? onAllCompleted}) async {
  for (final future in futures) {
    await future;
  }
  onAllCompleted?.call();
}

结合你的代码使用

基于你已生成的futures列表,直接调用顺序执行方法即可:

var uniqueIds = [1, 2, 3, 4];

List<Future<void>> futures = uniqueIds.map((e) {
  return APIService.shared
      .networkingRequest(input: e)
      .then((value) => update())
      .onError((error, stackTrace) => handleError(error));
}).toList();

// 顺序执行所有请求,并添加全局完成回调
await futures.waitInOrder(whenComplete: () {
  // 所有请求(无论成功/失败)都处理完成后执行的逻辑
  print('全部异步请求处理结束');
});

关键说明

  • 由于你给每个请求都添加了onError处理,单个请求失败不会中断后续请求,所有请求都会按顺序执行完毕。
  • 若需要在某个请求失败时立即终止后续执行,可移除每个Future的onError,改用try-catch包裹顺序执行逻辑:
try {
  await futures.waitInOrder(whenComplete: () {
    print('所有请求成功完成');
  });
} catch (error) {
  handleError(error);
  // 这里可添加失败后的终止逻辑
}

内容的提问来源于stack exchange,提问作者Vlad Z.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:40:25