如何按顺序链式调用多个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.
相关产品推荐
相关产品推荐

