В чем разница между async и async * в Dart?

89

Я делаю приложение с использованием фреймворка флаттера. Во время этого я наткнулся на ключевые слова в Dart asyncи async*. Кто-нибудь может сказать мне, в чем разница между ними?

Джаградж Сингх
источник

Ответы:

120

Отметка функции как asyncили async*позволяет ей использовать ключевое слово async/ awaitдля использования Future.

Разница между ними в том, что async*они всегда будут возвращать a Streamи предлагать некоторый синтаксический сахар для передачи значения через yieldключевое слово.

Поэтому мы можем сделать следующее:

Stream<int> foo() async* {
  for (int i = 0; i < 42; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;
  }
}

Эта функция каждую секунду выдает значение, которое увеличивается каждый раз.

Реми Русселе
источник
3
Вы должны добавить, где вы Dart Documentation
взяли
3
@ Skizo-ozᴉʞS ссылка мертва. Лучший документ, который я смог найти на нем, - это: dart.dev/tutorials/language/streams .
wdev
1
Помечая функцию как async *, мы можем использовать ключевое слово yield и возвращать поток данных.
Yash
81

Краткий ответ

  • async дает вам Future
  • async*дает вам Stream.

асинхронный

Вы добавляете asyncключевое слово в функцию, которая выполняет некоторую работу, которая может занять много времени. Он возвращает результат, завернутый в Future.

Future<int> doSomeLongTask() async {
  await Future.delayed(const Duration(seconds: 1));
  return 42;
}

Вы можете получить этот результат, ожидая будущего:

main() async {
  int result = await doSomeLongTask();
  print(result); // prints '42' after waiting 1 second
}

асинхронный *

Вы добавляете async*ключевое слово, чтобы создать функцию, которая по одному возвращает кучу будущих значений. Результаты обертываются в Stream.

Stream<int> countForOneMinute() async* {
  for (int i = 1; i <= 60; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;
  }
}

Технический термин для этого - функция асинхронного генератора. . Вы используете yieldдля возврата значения, а не returnпотому, что не покидаете функцию.

Вы можете использовать await forдля ожидания каждого значения, испускаемого Stream.

main() async {
  await for (int i in countForOneMinute()) {
    print(i); // prints 1 to 60, one integer per second
  }
}

Продолжается

Посмотрите эти видео, чтобы узнать больше, особенно о генераторах:

Suragch
источник
2
«Посмотрите эти видео» - было бы здорово, если бы вы также могли предоставить текстовые ссылки. Не все любят видео ...
Аконкагуа