Документация по этой теме разрежена, и трудно найти там "точку входа".
Какова семантика различных предметов RxJS?
Ответ 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/).-
Создание
-
new Rx.Subject()
-
-
Возвращает объект, который связывает его наблюдателя с его наблюдаемым (jsfiddle). Этот пример взят из официальной документации и отображает, как использовать объекты в качестве прокси. Субъект подписывается на источник (наблюдатель), а также прослушивается наблюдателями (наблюдаемая сторона). Любой вызов onNext
(сторона наблюдателя) приводит к тому, что наблюдаемая сторона вызывает onNext
с тем же значением для каждого из своих наблюдателей.
-
Rx.Subject.create(observer, observable)
Создает объект из указанного наблюдателя и наблюдает. Эти два не обязательно связаны. Хороший пример можно увидеть в реализации Rx.Dom.fromWebSocket
, который возвращает объект, используемый для отправки и приема данных из сокета. Сторона наблюдателя отправляет данные в сокет. Наблюдаемая сторона используется для прослушивания входящих данных из сокета. Кроме того, созданный таким образом объект не имеет метода dispose
.
Специализированная семантика Rx.Subject
- Эта
reactivex.io
документация охватывает довольно большую часть семантики специализированных тем. - Другие интересные моменты, которые следует упомянуть, относятся к поведению, прошедшему после завершения.
- Пример кода, описывающего поведение, приведен ниже для async, поведение, воспроизведение
Надеюсь, я не слишком сильно ошибался. Я буду рад, если вас исправит. Последнее примечание, это должно быть справедливо для RxJS v4.
Подробное объяснение поведения холодных/горячих наблюдаемых можно назвать: Горячие и холодные наблюдаемые: есть ли "горячие" и "холодные" операторы?