Я создаю 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!:)");
Пример
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть две таблицы (brands и symbols) c полями (brand,num и symb,number соответственно) (Взял для примера несколько строк, на самом деле их гораздо больше)
здравстуйте, хочу сделать сайт со следующими друг за другом вопросами, отвечаешь на один вопрос, на том же месте появляется другой, но без...
В макете есть две картинки, которые смотрятся на 1920 экранах отлично, а на экранах 1366 они сливаются в одну картинку(использую сетку bootstrap)Как...