Какова семантика различных предметов RxJS?
Документация по этой теме немногочисленна, и там трудно найти "точку входа".
1 ответ
Семантика различается в зависимости от типа предмета. Я разделю их на два вида: ваниль (Rx.Subject
) и предметы специального назначения (остальные три). Субъекты специального назначения разделяют часть семантики ванильного субъекта с несколькими оговорками из-за своей специализации (например, поведение завершения / переподключения).
Ванильная Rx. Тематическая семантика
Ключевая особенность
- субъекты реализуют наблюдатель, наблюдаемый интерфейс (и одноразовый интерфейс, поскольку они имеют
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
документация довольно хорошо охватывает большую часть семантики специализированных предметов. - Другие интересные моменты, которые следует упомянуть, касаются поведения после завершения.
- Пример кода, иллюстрирующий поведение здесь для асинхронного, поведения, воспроизведения
Надеюсь, я не слишком ошибся. Я буду счастлив, чтобы быть исправленным. Последнее замечание, это должно быть действительно для RxJS v4.
Для подробного объяснения поведения холодных / горячих наблюдаемых можно обратиться к: Горячим и холодным наблюдаемым: есть ли "горячие" и "холодные" операторы?