Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

семантика Vanilla Rx.Subject

  • Основные функции

    • субъекты реализуют наблюдателя, наблюдаемый интерфейс (и одноразовый интерфейс, поскольку у них есть обработчик 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 документация охватывает довольно большую часть семантики специализированных тем.
  • Другие интересные моменты, которые следует упомянуть, относятся к поведению, прошедшему после завершения.
  • Пример кода, описывающего поведение, приведен ниже для async, поведение, воспроизведение

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

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