Dart异步场景下如何控制执行流 解决forEach异步操作未完成提前返回问题
问题核心原因
Dart的Iterable.forEach方法不支持等待异步回调执行完成,你传入的async回调会直接返回Future对象,但forEach不会阻塞等待这些Future执行完毕,因此函数会提前返回还未填充数据的空列表。
可行实现方案
方案1:并行执行校验(推荐,性能更优)
使用Future.wait批量等待所有异步校验任务完成,所有HTTP请求可并行发起,总耗时等于最慢的单次请求耗时:
Future<List<Music>?> getAvaliableFmMusics(List<Music>? recommand) async { if (recommand == null) return null; // 为每个音乐生成对应的校验Future,同时保存原音乐对象和校验结果 final checkFutures = recommand.map((element) async { final isLegacy = await ReddwarfMusic.legacyMusic(element); return MapEntry(element, isLegacy); }); // 等待所有校验请求全部执行完成 final checkResults = await Future.wait(checkFutures); // 筛选出非legacy音乐返回 return checkResults.where((entry) => !entry.value).map((entry) => entry.key).toList(); }
方案2:串行执行校验
如果需要控制请求并发量避免触发接口限流,可改用普通for循环逐个等待校验完成,总耗时为所有请求耗时之和:
Future<List<Music>?> getAvaliableFmMusics(List<Music>? recommand) async { final List<Music> resultMusic = List.empty(growable: true); if (recommand == null) return null; // 普通for循环支持await阻塞等待异步操作完成 for (var element in recommand) { bool isLegacyMusic = await ReddwarfMusic.legacyMusic(element); if (!isLegacyMusic) { resultMusic.add(element); } } return resultMusic; }
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

