Метод asyncExpand< E>
-
Stream<
E>? convert( - T event
Преобразует каждый элемент в последовательность асинхронных событий.
Возвращает новый поток, и для каждого события этого потока выполняется следующее:
- Если событие является ошибкой или завершением, оно непосредственно передаётся в возвращаемый поток.
- В противном случае это элемент. Затем функция
convertвызывается с элементом в качестве аргумента для создания потока convert для этого элемента. - Если этот вызов вызывает ошибку, ошибка передаётся в возвращаемый поток.
- Если вызов возвращает
null, дальнейшие действия для элементов не выполняются. - В противном случае, этот поток приостанавливается, и к потоку convert подключается слушатель. Каждое событие данных и ошибка потока convert передаётся в возвращаемый поток в порядке их возникновения. Когда поток convert завершается, этот поток возобновляется.
Возвращаемый поток является потоком широковещательной передачи, если таковым является этот поток.
Реализация
Stream<E> asyncExpand<E>(Stream<E>? convert(T event)) {
_StreamControllerBase<E> controller;
if (isBroadcast) {
controller = _SyncBroadcastStreamController<E>(null, null);
} else {
controller = _SyncStreamController<E>(null, null, null, null);
}
controller.onListen = () {
StreamSubscription<T> subscription = this.listen(null,
onError: controller._addError, // Avoid Zone error replacement.
onDone: controller.close);
subscription.onData((T event) {
Stream<E>? newStream;
try {
newStream = convert(event);
} catch (e, s) {
controller.addError(e, s);
return;
}
if (newStream != null) {
subscription.pause();
controller.addStream(newStream).whenComplete(subscription.resume);
}
});
controller.onCancel = subscription.cancel;
if (!isBroadcast) {
controller
..onPause = subscription.pause
..onResume = subscription.resume;
}
};
return controller.stream;
}
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.18.5/dart-async/Stream/asyncExpand.html