list.forEach在异步方法中未正确等待

时间:2019-08-02 10:41:36

标签: flutter dart async-await

await中使用forEach时,代码不会等待,并且会在forEach之后继续执行代码,但是,当使用普通的for时,请等待以下代码段:

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完成后打印。

我做错什么了吗?

1 个答案:

答案 0 :(得分:6)

使用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");
}