Spec-Zone.ru › Dart 2

dart:async

Конструктор Stream<T>.fromIterable

Stream<T>.fromIterable(
  1. Iterable<T> elements
)

Создаёт поток, получающий данные из elements.

Итерация по объекту iterable начинается, когда поток получает слушателя, и прекращается, если слушатель отменяет подписку, либо если метод Iterator.moveNext возвращает false или вызывает исключение. Итерация приостанавливается, пока подписка на поток приостановлена.

Если вызов Iterator.moveNext для elements.iterator вызывает исключение, поток передаёт эту ошибку, а затем закрывается. Если чтение Iterator.current для elements.iterator вызывает исключение, поток передаёт эту ошибку, но продолжает итерацию.

Можно подписаться несколько раз. Каждый слушатель выполняет итерацию по elements независимо.

Пример:

final numbers = [1, 2, 3, 5, 6, 7];
final stream = Stream.fromIterable(numbers);

Реализация

factory Stream.fromIterable(Iterable<T> elements) =>
    Stream<T>.multi((controller) {
      Iterator<T> iterator;
      try {
        iterator = elements.iterator;
      } catch (e, s) {
        controller.addError(e, s);
        controller.close();
        return;
      }
      var zone = Zone.current;
      var isScheduled = true;

      void next() {
        if (!controller.hasListener || controller.isPaused) {
          // Cancelled or paused since scheduled.
          isScheduled = false;
          return;
        }
        bool hasNext;
        try {
          hasNext = iterator.moveNext();
        } catch (e, s) {
          controller.addErrorSync(e, s);
          controller.closeSync();
          return;
        }
        if (hasNext) {
          try {
            controller.addSync(iterator.current);
          } catch (e, s) {
            controller.addErrorSync(e, s);
          }
          if (controller.hasListener && !controller.isPaused) {
            zone.scheduleMicrotask(next);
          } else {
            isScheduled = false;
          }
        } else {
          controller.closeSync();
        }
      }

      controller.onResume = () {
        if (!isScheduled) {
          isScheduled = true;
          zone.scheduleMicrotask(next);
        }
      };

      zone.scheduleMicrotask(next);
    });

© 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/Stream.fromIterable.html

Spec-Zone.ru

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