Модификатор async*
Модификатор async* применяется к функции или методу,
превращая их в асинхронный генератор. Такая функция
возвращает объект Stream, а не Future. Внутри
такой функции можно использовать оператор yield для
последовательной выдачи значений. Каждое выданное значение
попадает в поток по мере его готовности. Функция с
модификатором async* может также использовать
await для ожидания других асинхронных операций.
Параметры функции при этом остаются обычными: вы можете
передавать в неё любые аргументы, которые будут доступны
внутри тела генератора.
Синтаксис
Stream<Type> functionName(parameters) async* {
// тело генератора
yield value;
}
Пример
Давайте создадим простой асинхронный генератор, который
последовательно выдаёт числа от 1 до 3:
Stream<int> generateNumbers() async* {
for (int i = 1; i <= 3; i++) {
yield i;
}
}
void main() async {
await for (int num in generateNumbers()) {
print(num);
}
}
Результат выполнения кода:
1
2
3
Пример
Давайте создадим генератор, который использует await
для имитации задержки между выдачей значений:
Stream<String> generateStrings() async* {
yield 'abcde';
await Future.delayed(Duration(seconds: 1));
yield '12345';
}
void main() async {
await for (String str in generateStrings()) {
print(str);
}
}
Результат выполнения кода (с задержкой в 1 секунду между строками):
"abcde"
"12345"