Поскольку 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
(даже если они не предназначены для такой работы, но все же это будет возможно) не работает так, как предполагалось?