Цикл await for в Dart
Цикл await for - точка, где описание потока
превращается в работу. Пока тело цикла ждет
элемент, генератор async* может выполнять
код и вызывать yield; когда элементов
больше нет, цикл завершается.
Первый запуск можно отметить строкой в начале
генератора - она появится только после старта
await for:
import 'dart:async';
Stream<int> probe() async* {
print('run');
yield 1;
}
void main() async {
await for (int n in probe()) {
}
}
Метка "run" печатается один раз на один
проход. До цикла await for внутренний код
потока не трогается.
Повторный вызов той же async*-функции
снова входит в тело с нуля. Такой поток называют
холодным: он оживает под каждое чтение отдельно:
import 'dart:async';
Stream<int> probe() async* {
print('run');
yield 1;
}
void main() async {
await for (int n in probe()) {
}
await for (int n in probe()) {
}
}
"run" дважды означает два независимых
прохода, а не продолжение прежнего. Общего
состояния между чтениями у нового потока нет.
Сделайте поток, который в начале печатает
"go" и отдает число 7.
Дважды прочитайте его через await for
в одной main и убедитесь, что метка
повторяется.
Поток отдает две строки "a" и "b".
При первом await for выведите каждую
букву, при втором вызове функции - только
длину строки. Оба чтения должны получить
полную пару значений.