Дарт: Как вернуть Будущее <void> - PullRequest
0 голосов
/ 31 января 2020

Как я могу вернуть 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 l oop и все операции удаления завершены?

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Вам не нужно ничего возвращать вручную, так как функция 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 голос
/ 31 января 2020

Вы не можете сделать это с 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:

  1. , когда вы хотите получить результат из асинхронной функции и хотите сделать некоторые логи c на результат
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:

  1. Когда вы просто вызываете другую асинхронную функцию
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"});
}
...