Метод asyncMap
Метод asyncMap класса Stream асинхронно
преобразует каждый элемент исходного потока
с помощью переданной функции и возвращает новый
поток с преобразованными значениями. В первый
параметр мы передаем функцию-преобразователь,
которая принимает текущий элемент потока
и возвращает Future с новым значением.
Метод ожидает завершения каждого такого
Future, прежде чем обработать следующий
элемент потока. Это позволяет выполнять
асинхронные операции, например, сетевые запросы
или чтение файлов, для каждого элемента потока.
Метод возвращает новый поток типа Stream,
элементы которого являются результатами
выполнения переданной функции.
Синтаксис
Stream<R> asyncMap<R>(FutureOr<R> convert(T event))
Пример
Давайте асинхронно преобразуем каждый элемент
потока, умножая его на 2 с небольшой
задержкой:
void main()
{
Stream.fromIterable([1, 2, 3, 4, 5]).asyncMap((int el) async {
await Future.delayed(Duration(milliseconds: 100));
return el * 2;
}).listen((int el) {
print(el);
});
}
Результат выполнения кода:
2
4
6
8
10
Пример
Давайте асинхронно преобразуем каждую строку потока в ее длину:
void main()
{
Stream.fromIterable(['a', 'b', 'c', 'd', 'e']).asyncMap((String el) async {
await Future.delayed(Duration(milliseconds: 50));
return el.length;
}).listen((int el) {
print(el);
});
}
Результат выполнения кода:
1
1
1
1
1
Пример
Давайте соберем результаты асинхронного
преобразования в список с помощью метода
toList:
void main() async
{
List<int> res = await Stream.fromIterable([1, 2, 3, 4, 5]).asyncMap((int el) async {
await Future.delayed(Duration(milliseconds: 10));
return el + 10;
}).toList();
print(res);
}
Результат выполнения кода:
[11, 12, 13, 14, 15]
Смотрите также
-
метод
map,
который синхронно преобразует элементы потока -
метод
asyncExpand,
который асинхронно разворачивает элементы потока -
метод
where,
который фильтрует элементы потока -
класс
Stream,
который представляет асинхронный поток данных