Dart:如何 return 未来 <void>
Dart: How to return Future<void>
我怎样才能returnFuture<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(...));
}
当 forEach
循环和所有删除操作完成后,我如何 return Future<void>
?
您不需要手动 return 任何东西,因为 async
函数只会在函数实际完成时 return,但这取决于 how/if您等待在此函数中执行的调用。
查看您的示例,您缺少 async
关键字,这意味着您需要编写以下内容:
Future<void> deleteAll(List stuff) async {
stuff.forEach( s => delete(s));
}
Future<void> delete(Stuff s) async {
....
await file.writeAsString(jsonEncode(...));
}
当使用 Future<void>
时,不需要明确地 return 任何东西,因为 void
什么都不是,顾名思义。
还要确保使用 await
.
调用 deleteAll
和 writeAsString()
注意:要等待所有 delete
/foreach
调用完成,请参阅下面的答案了解更多详细信息。简而言之,您需要将所有 delete
调用放入 Future.wait
中。
你不能用 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
关键字:
当您的函数在内部使用 await
关键字时,您可以使用 async
。
那么什么时候使用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"});
}
我怎样才能returnFuture<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(...));
}
当 forEach
循环和所有删除操作完成后,我如何 return Future<void>
?
您不需要手动 return 任何东西,因为 async
函数只会在函数实际完成时 return,但这取决于 how/if您等待在此函数中执行的调用。
查看您的示例,您缺少 async
关键字,这意味着您需要编写以下内容:
Future<void> deleteAll(List stuff) async {
stuff.forEach( s => delete(s));
}
Future<void> delete(Stuff s) async {
....
await file.writeAsString(jsonEncode(...));
}
当使用 Future<void>
时,不需要明确地 return 任何东西,因为 void
什么都不是,顾名思义。
还要确保使用 await
.
deleteAll
和 writeAsString()
注意:要等待所有 delete
/foreach
调用完成,请参阅下面的答案了解更多详细信息。简而言之,您需要将所有 delete
调用放入 Future.wait
中。
你不能用 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
关键字:
当您的函数在内部使用 await
关键字时,您可以使用 async
。
那么什么时候使用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"});
}