Spec-Zone.ru › Dart 2

dart:async

Метод asyncExpand<E>

Stream<E> asyncExpand<E>(
  1. Stream<E>? convert(
    1. 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API