首页 > 解决方案 > 具有自定义创建逻辑的 RxJS BehaviorSubject

问题描述

因为BehaviorSubjectextendsSubjectSubjectextends 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 毫秒)

但是当我ObservableSubject/替换时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();

我仍然无法强制它发出值。

我知道主题被设计为接收来自外部世界的值(而不是在内部将它们生成为 Observables),因此主题应由外部代码触发subject.next('value'),但我只是好奇,如果它们与 Observables 严格相关,背后的逻辑create并且进一步的行为应该是相同的......

谁能解释一下,为什么createon的使用Subject(即使它们不是设计为以这种方式工作,但仍然有可能)不能按预期工作?

标签: rxjs

解决方案


推荐阅读