【问题标题】:Dart: How to return Future<void>Dart:如何返回 Future<void>
【发布时间】:2020-01-31 09:20:17
【问题描述】:

如何返回Future&lt;void&gt;

   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 循环和所有删除操作完成后如何返回Future&lt;void&gt;

【问题讨论】:

  • @pascal 我不认为Giovanni Terlingen 的答案是正确的。请参阅这些示例Dartpad
  • 谢谢,我去看看

标签: android asynchronous flutter future


【解决方案1】:

您不需要手动返回任何内容,因为async 函数只会在函数实际完成时返回。

查看您的示例,您缺少 async 关键字,这意味着您需要编写以下代码:

Future<void> deleteAll(List stuff) async {
    stuff.forEach( s => delete(s));
}

Future<void> delete(Stuff s) async {
   ....
   await file.writeAsString(jsonEncode(...));
}

没有必要返回任何东西,因为void 什么都不是,顾名思义。

还要确保使用await 调用deleteAllwriteAsString()

【讨论】:

  • 我想在 deleteAll 和所有删除调用完成时收到通知,以便我可以使用 delteAll().then(() => refreshUI())。正确的策略是什么?
  • 要使用.then(),请使用我的代码示例。将函数签名定义为async 就足够了。
  • delete() 是一个异步函数。我忘了在代码 sn-p 中添加 async 关键字。 delete() 的实现是使用 getApplicationsDIrectory() ,它也是一个异步函数。
  • 这是不正确的。尝试在stuff.forEach... 之后添加print("deleteAll")。并在file.writeAs.... 之后添加print("delete")。您将看到在打印所有 delete 之前打印了 deleteAll
  • 所以你可以看到forEach只调用了delete函数asyncronoslly。它不会等待delete 方法完成
【解决方案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关键字:

当您的函数在内部使用 await 关键字时,您可以使用 async

那么什么时候使用await关键字:

  1. 当您想要从异​​步函数中获取结果并想要对结果执行一些逻辑时
Future<int> fetchCountAndValidate() asycn{
  final result = await fetchCountFromServer();
  if(result == null)
    return 0;
  else
   return result;
}
  1. 当你想调用多个异步函数时
Future<int> fetchTotalCount() asycn{
  final result1 = await fetchCount1FromServer();
  final result2 = await fetchCount2FromServer();
  return result1 + result2;
}

当您不需要asyncawait 时:

  1. 当您只是调用另一个异步函数时
Future<int> getCount(){
  //some synchronous logic
  final requestBody = {
    "countFor": "..."
  };
  return fetchCountFromServer(requestBody); //this is an asynchronous function which returns `Future<int>`
}
  1. 对于一些罕见的情况,我们不关心异步函数的完成
void sendLogoutSignal(){
  http.post(url, {"username" : "id0001"});
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2020-01-05
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多