Spec-Zone.ru › Dart 2

dart:async

Метод firstWhere

Future<T> firstWhere(
  1. bool test(
    1. T element
    ),
  2. {T orElse( )?}
)

Находит первый элемент этого потока, соответствующий test.

Возвращает будущее, которое завершается первым элементом этого потока, для которого test возвращает true.

Если такой элемент не найден до завершения этого потока, и функция orElse предоставлена, результат вызова orElse становится значением будущего. Если orElse генерирует ошибку, возвращаемое будущее завершается этой ошибкой.

Если этот поток генерирует ошибку до первого соответствующего элемента, возвращаемое будущее завершается этой ошибкой, и обработка останавливается.

Останавливает прослушивание этого потока после получения первого соответствующего элемента или ошибки.

Внутренне метод отменяет свою подписку после первого элемента, соответствующего предикату. Это означает, что потоки с одиночной подпиской (не широковещательные) закрываются и не могут быть повторно использованы после вызова этого метода.

Если произошла ошибка или если этот поток завершается без нахождения совпадения и без предоставленной функции orElse , возвращаемое будущее завершается с ошибкой.

Пример:

var result = await Stream.fromIterable([1, 3, 4, 9, 12])
    .firstWhere((element) => element % 6 == 0, orElse: () => -1);
print(result); // 12

result = await Stream.fromIterable([1, 2, 3, 4, 5])
    .firstWhere((element) => element % 6 == 0, orElse: () => -1);
print(result); // -1

Реализация

Future<T> firstWhere(bool test(T element), {T orElse()?}) {
  _Future<T> future = new _Future();
  StreamSubscription<T> subscription =
      this.listen(null, onError: future._completeError, onDone: () {
    if (orElse != null) {
      _runUserCode(orElse, future._complete, future._completeError);
      return;
    }
    try {
      // Sets stackTrace on error.
      throw IterableElementError.noElement();
    } catch (e, s) {
      _completeWithErrorCallback(future, e, s);
    }
  }, cancelOnError: true);

  subscription.onData((T value) {
    _runUserCode(() => test(value), (bool isMatch) {
      if (isMatch) {
        _cancelAndValue(subscription, future, value);
      }
    }, _cancelAndErrorClosure(subscription, future));
  });
  return future;
}

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

Spec-Zone.ru

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