Метод asyncExpand
Метод asyncExpand принимает функцию-преобразователь,
которая для каждого элемента исходного потока возвращает
новый поток. Метод подписывается на эти новые потоки
по очереди и передает их элементы в результирующий поток.
В отличие от метода expand, функция-преобразователь
здесь может быть асинхронной, то есть возвращать Future
или Stream.
Первым параметром мы передаем функцию, которая принимает элемент исходного потока и возвращает новый поток. Второй необязательный параметр позволяет указать поведение при ошибках. Важно отметить, что потоки, возвращаемые функцией, обрабатываются последовательно: следующий поток начнет испускаться только после завершения предыдущего.
Синтаксис
Stream<T> asyncExpand<T>(Stream<T> Function(S) convert)
Пример
Давайте преобразуем каждый элемент исходного потока в новый поток из двух элементов и соберем результат в список:
Stream<int> createStream(int value)
{
return Stream.fromIterable([value, value * 10]);
}
void main() async
{
Stream<int> stream = Stream.fromIterable([1, 2, 3]);
List<int> res = await stream
.asyncExpand((value) => createStream(value))
.toList();
print(res);
}
Результат выполнения кода:
[1, 10, 2, 20, 3, 30]
Пример
Давайте используем асинхронную функцию, которая
возвращает Future с новым потоком, чтобы
продемонстрировать асинхронную природу метода:
Future<Stream<String>> getWords(String prefix) async
{
return Stream.fromIterable(['$prefix-a', '$prefix-b']);
}
void main() async
{
Stream<String> stream = Stream.fromIterable(['x', 'y']);
List<String> res = await stream
.asyncExpand((value) => getWords(value))
.toList();
print(res);
}
Результат выполнения кода:
["x-a", "x-b", "y-a", "y-b"]