Создание потоков с 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 — локальная установка не требуется.
Все уроки этого курса
- Прослушивание с await for
- Одноразовые и широковещательные потоки
- Преобразование потоков: map, where, take
- Создание потоков с async*