Какова семантика различных предметов RxJS?

Документация по этой теме немногочисленна, и там трудно найти "точку входа".

1 ответ

Решение

Семантика различается в зависимости от типа предмета. Я разделю их на два вида: ваниль (Rx.Subject) и предметы специального назначения (остальные три). Субъекты специального назначения разделяют часть семантики ванильного субъекта с несколькими оговорками из-за своей специализации (например, поведение завершения / переподключения).

Ванильная Rx. Тематическая семантика

  1. Ключевая особенность

    • субъекты реализуют наблюдатель, наблюдаемый интерфейс (и одноразовый интерфейс, поскольку они имеют dispose обработчик на их прототип). Это означает, среди прочего, что они имеют:
      • интерфейс наблюдателя: onNext, onError, onComplete метод
      • наблюдаемый интерфейс: subscribe метод
    • Вы можете привести субъект к наблюдателю или к наблюдаемому, скрывая реализацию дополнительных интерфейсов (ср. .asObserver(), а также .asObservable()) если нужно
    • поскольку объект является наблюдаемым, вы можете подписать несколько наблюдателей. Эта наблюдаемая затем передаст свои данные всем своим наблюдателям. Внутренне субъект поддерживает множество наблюдателей.
    • субъект, являющийся наблюдателем, вы можете подписать его на любой наблюдаемый
    • наблюдатель и наблюдаемое, составляющие предмет, представляющий собой две разные сущности, вы можете использовать их независимо от другого, если это ваш вариант использования.
    • dispose Эта тема отписывает всех наблюдателей и освобождает ресурсы.
    • Субъекты не берут планировщик, а предполагают, что вся сериализация и грамматическая корректность обрабатываются вызывающим субъектом.
    • Поведение субъектов по умолчанию состоит в том, чтобы синхронно передавать свои значения наблюдателям, начиная с первого подписанного наблюдателя и заканчивая последним. В большинстве случаев порядок не имеет значения, в других это будет иметь значение.

Я процитирую ключевой аспект контракта и грамматики Rxjs:

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

  • ванильный предмет (создан с new Rx.Subject()) реализует эту грамматику: когда onCompleted был вызван один раз, все последующие вызовы onNext игнорируются Второй звонок onCompleted на том же наблюдателе тоже игнорируется. Если наблюдатель присоединяется к наблюдаемой стороне субъекта, его onComplete обратный вызов будет немедленно вызван ( http://jsfiddle.net/cLf6Lqsn/1/).

    1. Создание

      • new Rx.Subject()

    Возвращает субъект, который связывает своего наблюдателя с наблюдаемым ( jsfiddle). Этот пример взят из официальной документации и показывает, как использовать предметы в качестве прокси. Субъект подписан на источник (сторона наблюдателя), а также прослушивается наблюдателями (сторона наблюдаемая). Любой звонок в onNext (сторона наблюдателя) приводит к вызову наблюдаемой стороны onNext с одинаковым значением для каждого из своих наблюдателей.

    • Rx.Subject.create(observer, observable)

    Создает предмет из указанного наблюдателя и является наблюдаемым. Эти два не обязательно связаны. Хороший пример можно увидеть в реализации Rx.Dom.fromWebSocket который возвращает тему, используемую для отправки и получения данных из сокета. Наблюдающая сторона субъекта отправляет данные в сокет. Наблюдаемая сторона используется для прослушивания входящих данных из сокета. Кроме того, тема, созданная таким образом, НЕ имеет dispose метод.

Специализированная семантика Rx.Subject

  • это reactivex.io документация довольно хорошо охватывает большую часть семантики специализированных предметов.
  • Другие интересные моменты, которые следует упомянуть, касаются поведения после завершения.
  • Пример кода, иллюстрирующий поведение здесь для асинхронного, поведения, воспроизведения

Надеюсь, я не слишком ошибся. Я буду счастлив, чтобы быть исправленным. Последнее замечание, это должно быть действительно для RxJS v4.

Для подробного объяснения поведения холодных / горячих наблюдаемых можно обратиться к: Горячим и холодным наблюдаемым: есть ли "горячие" и "холодные" операторы?

Другие вопросы по тегам