【问题标题】:list.forEach doesn't await properly in async methodlist.forEach 在异步方法中没有正确等待
【发布时间】:2019-12-10 23:41:21
【问题描述】:

当在forEach 中使用await 时,代码不会等待,而是在forEach 之后继续执行代码,但是,当使用普通的for 时,它会正常等待,请参阅以下 sn -p:

Future<void> uploadTexts(List<String> someTexts) async {
    for(int i = 0; i < someTexts.length ; i++) {
      var text = someTexts[i];
      if (text  != null) {
        await uploadText(text);
      }
    }
    print("THIS PRINTS AFTER THE FOR IS DONE");
  }
Future<void> uploadTexts(List<String> someTexts) async {

 someTexts.where((text) => text != null).forEach((text) async{
    await uploadText(text);
  });
  print("THIS PRINTS BEFORE THE FOREACH IS DONE");
}

第一个示例将在 for 完成后打印,而第二个示例将在 for 完成之前打印。

我是不是做错了什么?

【问题讨论】:

    标签: flutter dart async-await


    【解决方案1】:

    当您使用 for 时,您会在代码中执行 n 次操作,因此每个 await 都会按预期工作。使用forEach,您开始对列表的每个元素进行一些操作并继续执行以下代码,因此在这种情况下您无需等待await 的结果

    UPD:

    这是forEach的解决方案:

    Future<void> uploadTexts(List<String> someTexts) async {
      List<String> filtered = someTexts.where((text) => text != null);
      await Future.forEach(filtered, (text) async {
        await uploadText(text);
      });
      print("THIS PRINTS BEFORE THE FOREACH IS DONE");
    }
    

    【讨论】:

    • 谢谢。但是可以等待foreach吗?
    • 我已经更新了我的答案。我找到的唯一方法是Future.forEach
    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多