0Pricing
Dart Academy · Урок

Создание потоков с async*

Генерация событий с помощью генератора

«Создание потоков с async*» — бесплатный урок Dart Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Dart Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Dart Academy содержит 4 уроков всего.

Создание собственных потоков

До сих пор Вы использовали потоки, созданные другими. Теперь Вы создадите их самостоятельно с помощью async generator — самого удобного способа выдавать события.

Ключевое слово async*

Пометьте функцию как async*, и она станет генератором потока. Её возвращаемый тип — Stream, а значения она может выдавать с течением времени. 🚿

Stream<int> countTo(int n) async* {
  // body uses yield
}

yield выдаёт значение

Внутри функции async* yield отправляет одно значение в поток. Выполнение приостанавливается, пока прослушиватель не будет готов получить следующее значение.

Stream<int> oneTwo() async* {
  yield 1;
  yield 2;
}

yield в цикле

Объедините yield с циклом, чтобы выдать множество значений. На каждой итерации следующее число автоматически отправляется в поток.

Stream<int> countTo(int n) async* {
  for (var i = 1; i <= n; i++) yield i;
}

await внутри async*

Поскольку функция асинхронная, между операторами yield можно использовать await. Это позволяет получить данные или сделать паузу перед выдачей следующего события.

Stream<int> ticker() async* {
  while (true) {
    await Future.delayed(Duration(seconds: 1));
    yield DateTime.now().second;
  }
}

yield* передаёт поток

Используйте yield*, чтобы выдать из генератора каждое событие другого потока. Так весь поток добавляется к Вашему.

Stream<int> combined() async* {
  yield* countTo(3);
  yield 99;
}

Ленивый запуск до прослушивания

Функция async* не начинает выполняться, пока кто-либо не начнёт её прослушивать. Тело выполняется только по мере получения прослушивателем каждого значения. ⏸️

Пауза учитывает прослушивателя

Если прослушиватель приостанавливается, генератор тоже приостанавливается на следующем yield. Такое противодавление не позволяет производителям перегружать получателей.

Ошибки из async*

throw внутри функции async* превращается в событие ошибки в потоке. Прослушиватели могут перехватить её так же, как любую другую ошибку потока.

Stream<int> risky() async* {
  yield 1;
  throw 'boom';
}

Использование собственного генератора

Читайте созданный Вами поток обычным способом — с помощью await for. Каждое значение, выданное через yield, поступает в цикл по порядку.

await for (final n in countTo(3)) {
  print(n);
}

async* и StreamController

Для последовательной выдачи данных по запросу async* проще, чем StreamController. Используйте контроллер только тогда, когда события поступают из внешних обратных вызовов.

Быстрая проверка

Как выдать значение из функции async*?

Итоги

Вы создавали потоки с помощью async*, отправляли значения через yield, передавали их через yield* и использовали await между событиями. Теперь Вы умеете и получать, и создавать потоки. 🎉

Часто задаваемые вопросы

Урок «Создание потоков с async*» бесплатный?

Да — полный текст урока «Создание потоков с async*» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Dart Academy, подпишись на CoddyKit PRO. Курс Dart Academy содержит 4 уроков всего.

Чему я научусь в уроке «Создание потоков с async*»?

Генерация событий с помощью генератора Ты практикуешь Dart Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Dart Academy?

Предыдущий опыт не требуется. Dart Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Создание потоков с async*»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Dart Academy?

Да. Каждый урок Dart Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Прослушивание с await for
  2. Одноразовые и широковещательные потоки
  3. Преобразование потоков: map, where, take
  4. Создание потоков с async*
← Назад к Dart Academy