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.19.6/dart-async/Stream/asyncExpand.html