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

Max*_*aga 2 async-await dart flutter

在中使用awaitforEach,代码不会等待,并且会在之后继续执行代码forEach,但是,在使用normal时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");
  }
Run Code Online (Sandbox Code Playgroud)
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");
}
Run Code Online (Sandbox Code Playgroud)

for结束后将打印第一个示例,而for结束前将打印第二个示例。

难道我做错了什么?

And*_*sky 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");
}
Run Code Online (Sandbox Code Playgroud)