RxJS BehaviorSubject с пользовательской логикой создания - PullRequest
0 голосов
/ 07 ноября 2018

Поскольку BehaviorSubject расширяет Subject и Subject расширяет Observable, все эти три имеют статический метод .create(observer) для их создания с использованием логики вывода пользовательских значений.
Я могу использовать с хорошим результатом Observable.create(observer), например:

a = Rx.Observable.create(obs => {
    setInterval(() => {
        obs.next('tick');
    }, 500)
})
s = a.subscribe(v => console.log(v))

Дает ожидаемый результат (tick каждые 500 мс)

Но когда я заменяю Observable на Subject / BehaviorSubject, он не очень хочет начать работать:

a = Rx.Subject.create(obs => {
    setInterval(() => {
        obs.next('tick');
    }, 500)
})
s = a.subscribe(v => console.log(v)); // Nothing
a.next(5); // Still nothing

По сути, субъект, кажется, работает, как и предполагалось, только если он создан с помощью оператора new, как показано ниже:

a = new Rx.Subject();
s = a.subscribe(v => {console.log(v)});
a.next(5) // Ok, got value here

Даже если я попытаюсь использовать непараметризованный метод create, вызов которого сводится к тому же результату, что и при использовании new:

a = Rx.Subject.create();

Я все еще не могу заставить его выдавать значения.

Мне известно, что субъекты предназначены для получения значений из внешнего мира (а не для их генерации внутри себя в качестве наблюдаемых), поэтому субъект должен вызываться внешним кодом с subject.next('value'), но мне было просто интересно, что если они строго относящиеся к наблюдаемым, логика create и дальнейшее поведение должны быть такими же ...

Может кто-нибудь объяснить, почему использование create на Subject (даже если они не предназначены для такой работы, но все же это будет возможно) не работает так, как предполагалось?

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