Dart循环内部为异步逻辑时如何实现外部逻辑同步执行?
问题根因
- 原代码中
List.forEach不支持等待异步回调执行完成:forEach方法的返回值是void,即使传入的回调是async函数,外层的async函数也无法感知到内部的异步任务状态,所以不会等待所有回调执行完成就会继续运行后续代码。 pS函数没有返回内部创建的Future.delayed实例:导致await pS(element)实际等待的是一个已经完成的空Future,没有起到等待延迟任务的作用。main函数中调用gogo时没有加await:async函数如果不被await,调用方不会等待其内部逻辑执行完成。
修改方案
方案1:并发执行异步任务(总耗时约1秒,4个值同时输出)
void main() async { List<String> list = ['1', '2', '3', '4']; // 等待gogo函数执行完成 await gogo(list); print('main end'); } Future<void> gogo(List list) async { // 用Future.wait批量等待所有异步任务执行完成 await Future.wait(list.map((element) => pS(element))); print('gogo end'); } Future pS(String s) async { // 显式返回Future实例 return Future.delayed(Duration(seconds: 1), () { print(s); }); }
方案2:串行执行异步任务(总耗时约4秒,按顺序每秒输出一个值)
如果需要严格保证1、2、3、4的输出顺序,可以替换gogo的实现为常规for循环:
Future<void> gogo(List list) async { for (var element in list) { await pS(element); } print('gogo end'); }
两种方案最终输出都符合预期要求。
内容的提问来源于stack exchange,提问作者Zhuoyuan.Li
相关产品推荐
相关产品推荐

