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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:24:01