Ответ 1
На этот вопрос лучше всего ответить участники, участвующие в Rxjs5, но вот мой прием:
-
shareReplay
- операторmulticast
сReplaySubject
, за которым следуетrefCount
. Поэтому я бы поспорил, чтоpublishReplay(x).refCount()
должен быть очень близок к поведениюshareReplay
. В любом случаеpublishReplay
уже дает вам все упомянутые вами моменты.refCount
добавляет отмену подписки, когда больше нет наблюдателей (refCount
уменьшено до 0). - вы можете ознакомиться со спецификациями здесь http://reactivex.io/rxjs/test-file/spec-js/operators/publishReplay-spec.js.html. См. Строку 127 ниже
var replayed = source.publishReplay(1).refCount();
, которая должна быть эквивалентна вашемуshareReplay(1)
.
О остальном вопрос:
- Я думаю, мы все хотим, чтобы
good reference that shows how to find what kind of observable I have...
. Есть много мест, включая документацию Rxjs4, где вы найдете объяснения о горячих и холодных наблюдаемых. - Здесь и здесь приведены примеры ресурсов.
Следующее мое понимание этого вопроса:
- субъекты горячие (в основном, в любом случае, поскольку вы можете утверждать, что субъект воспроизведения имеет поведение ближе, чем холодное наблюдаемое).
- все наблюдаемые являются холодными, если явно не указано иное.
- среди явных способов сделать холодный наблюдаемый горячий, у вас есть оператор
multicast
и его производныеshare
,publish
,shareReplay
и т.д. Эти операторы внутри всего включают предметы. - Обратите внимание, что вам не нужно видеть, что эти операторы были использованы. Но в этом случае API или документация должны прямо указывать вам. Например,
Rx.Observable.fromEvent('input','click')
является горячим. Вы можете видеть в своей реализации, что естьshare
где-то. - для дихотомии "горячая/холодная" вам нужно добавить тип
connectable
, который до его подключения не является ни горячим, ни холодным. -
defer
всегда приводят к наблюдаемому холоду. - Наконец, некоторые операторы не изменяют природу наблюдаемого, но создают внутренние внутренние видимости и передают их в свой поток. Так обстоит дело, например,
groupBy
.op1.op2.groupBy
холодный, но он будет излучать горячие наблюдаемые значения в результирующем потоке. В таких случаях вам может помочь только документация (если есть). В противном случае, исходный код и тестовые спецификации. Или спросить о SO.