В чем отличия 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*, когда требуется генерировать последовательность результатов асинхронно.