В чем отличия async and async* в Dart?

В Dart, async
и async*
используются для пометки функций как асинхронных, но у них разные назначения и возвращаемые типы.
async
- Назначение: Помечает функцию как асинхронную.
- Возвращаемый тип:
Future<T>
- Использование: Когда вам нужно выполнить асинхронный код, который в итоге возвращает одно значение (или ничего, например,
void
). - Пример:
Future<int> fetchData() async { await Future.delayed(Duration(seconds: 2)); return 42; }
В этом примере функция возвращает
Future<int>
, который завершится через 2 секунды.
async*
- Назначение: Помечает функцию как асинхронный генератор.
- Возвращаемый тип:
Stream<T>
- Использование: Когда вам нужно вернуть последовательность значений асинхронно, обычно используется для создания потока данных.
- Пример:
В этом примере функцияasync*
возвращаетStream<int>
, который генерирует новое целое число каждую секунду.Stream<int> countStream() async* { for (int i = 1; i <= 5; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // Yield по одному отправляет значения. } }
Основные различия:
- Возвращаемый тип:
async
возвращаетFuture
, аasync*
возвращаетStream
. - Отправка значений:
async
возвращает одно значение (или ничего), в то время какasync*
может поочередно отправлять несколько значений (как поток данных). - Yield значений: Внутри
async*
используетсяyield
, чтобы поочередно отправлять значения в поток, тогда как вasync
возвращается одно значение в конце выполнения.
Таким образом, используйте async
, когда нужно дождаться результата, а async*
, когда требуется генерировать последовательность результатов асинхронно.