Я создаю Observable и подписываюсь на него дважды, но при этом обновление приходит только для последнего подписавшегося:
import { Observable } from "rxjs";
let observer;
let source = Observable.create(obs => observer = obs);
source.subscribe(m => console.log(`subscribe 1: ${m}`));
source.subscribe(m => console.log(`subscribe 2: ${m}`));
observer.next("hello!:)");
Я ожидал увидеть в консоли:
subscribe 1: hello!:)
subscribe 2: hello!:)
Но вместо этого получил только последнее сообщение:
subscribe 2: hello!:)
Можно ли сделать много подписок на одно событие?
Если да, то как это сделать?
Если добавить лог в callback:
let source = Observable.create(obs => {
console.log('callback');
observer = obs;
});
можно заметить, что он будет вызываться при каждом вызове subscribe.
Соответственно, при каждом вызове будет переписана глобальная переменная, в которой сохранится последнее значение.
Для решения можно воспользоваться методом share
let source = Rx.Observable.create(obs => observer = obs).share();
В этом случае один наблюдатель будет для всех подписок.
Пример
Альтернативным решением может стать использование Subject вместо Observable.create
let source = new Subject();
source.subscribe(m => console.log(`subscribe 1: ${m}`));
source.subscribe(m => console.log(`subscribe 2: ${m}`));
source.next("hello!:)");
Пример
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости