К счастью, в RxJS есть специальный и элегантный способ решения этой проблемы.
Вам необходимо, чтобы
несколько наблюдателей [...] получали одинаковые значения
Это называется многоадресной наблюдаемой, и есть определенные операторы , которые используются для создания одного из обычных "холодных" наблюдаемых.
Например, вместо того, чтобы создавать экземпляр Subject
напрямую, вы можете просто передать наблюдаемый источник оператору share
, и он создаст для вас Subject
.Документация share
гласит:
Возвращает новый объект Observable, который группирует (разделяет) исходный объект Observable.До тех пор, пока существует хотя бы один подписчик, эта наблюдаемая будет подписана и будет передавать данные.Когда все подписчики отписались, он отписывается от источника Observable.
Последнее предложение показывает небольшую разницу между share
и source$.subscribe(subject)
.С share
сохраняется так называемое refCount
, которое автоматически отписывает Subject
от его источника, когда на нем не осталось подписчиков.
Применительно к вашему коду это выглядит так:
const timer$ =
new rxjs.Observable(subscriber => {// your unchanged implementation})
.pipe(
share()
);
const subscription = timer$.subscribe(value => console.log("observer %s", value));
Вот полная версия с примером кода:
https://jsfiddle.net/50q746ad/
Кстати, share
- не единственный оператор, выполняющий многоадресную передачу. Существуют отличные учебные ресурсы , которые намного углубляются в эту тему.