在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完成后打印。
我做错什么了吗?
答案 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");
}