Шаблон для shareReplay (1) в RxJS5

Я начал играть с RxJS5 и теперь вижу, что больше нет метода shareReplay.

Вполне возможно, что я часто неправильно использовал shareReplay в RxJS4, но теперь я изо всех сил пытаюсь получить нужное поведение, то есть:

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

Как это реализовать с помощью RxJS5?

В общем, я думаю, что я очень хорошо понимаю операторов RxJS, но для меня это довольно холодно, горячо, публично, со мной. Есть ли хорошая ссылка, которая показывает, как найти, какие наблюдаемые у меня есть, так что я могу логически выяснить, почему подписка не получает значений или почему наблюдаемое выполняется несколько раз?

ИЗМЕНИТЬ

Счастливые новости, shareReplay() возвращается в RxJS 5.4.0:

Список изменений: https://github.com/ReactiveX/rxjs/blob/892700dd4f5d5e5f9ae9276ede32208f4390c5e9/CHANGELOG.md#540-2017-05-09

Документация Barebones: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-shareReplay

Ответ 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.