Подписки на события используя RxJs

99
31 августа 2019, 10:10

Я создаю 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!:)

Можно ли сделать много подписок на одно событие?
Если да, то как это сделать?

Answer 1

Если добавить лог в 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!:)");

Пример

READ ALSO
Выбрать данные по подстрокам mysql

Выбрать данные по подстрокам mysql

Есть две таблицы (brands и symbols) c полями (brand,num и symb,number соответственно) (Взял для примера несколько строк, на самом деле их гораздо больше)

136
сайт с вопросами на одной странице [закрыт]

сайт с вопросами на одной странице [закрыт]

здравстуйте, хочу сделать сайт со следующими друг за другом вопросами, отвечаешь на один вопрос, на том же месте появляется другой, но без...

126
Картинки большие для экранов 1368x768

Картинки большие для экранов 1368x768

В макете есть две картинки, которые смотрятся на 1920 экранах отлично, а на экранах 1366 они сливаются в одну картинку(использую сетку bootstrap)Как...

124