如何退回Future<void>
?
Future<void> deleteAll(List stuff){
stuff.forEach( s => delete(s)); //How do I return Future<void> when loop and all delete Operation are finished?
}
Future<void> delete(Stuff s) async {
....
file.writeAsString(jsonEncode(...));
}
Future<void>
循环和所有删除操作完成后,如何返回forEach
?
答案 0 :(得分:7)
您不需要手动返回任何内容,因为async
函数仅在该函数实际完成时返回。
查看示例,您缺少async
关键字,这意味着您需要编写以下内容:
Future<void> deleteAll(List stuff) async {
stuff.forEach( s => delete(s));
}
Future<void> delete(Stuff s) async {
....
await file.writeAsString(jsonEncode(...));
}
顾名思义,void
一无是处,因此无需返回任何内容。
还要确保您使用deleteAll
呼叫writeAsString()
和await
。
答案 1 :(得分:2)
您无法使用forEach
来做到这一点。
但是您可以像这样使用Future.wait
和.map
Future<void> deleteAll(List stuff) {
return Future.wait(stuff.map((s) => delete(s)));
}
Future<void> delete(Stuff s) async{
....
await file.writeAsString(jsonEncode(...));
}
何时使用async
关键字:
当函数内部使用async
关键字时,可以使用await
。
因此何时使用await
关键字:
Future<int> fetchCountAndValidate() asycn{
final result = await fetchCountFromServer();
if(result == null)
return 0;
else
return result;
}
Future<int> fetchTotalCount() asycn{
final result1 = await fetchCount1FromServer();
final result2 = await fetchCount2FromServer();
return result1 + result2;
}
不需要async
或await
时:
Future<int> getCount(){
//some synchronous logic
final requestBody = {
"countFor": "..."
};
return fetchCountFromServer(requestBody); //this is an asynchronous function which returns `Future<int>`
}
void sendLogoutSignal(){
http.post(url, {"username" : "id0001"});
}