由于BehaviorSubject
扩展了Subject
和Subject
扩展了Observable
,所以这三者都有静态的.create(observer)
方法,可以使用自定义值发射逻辑来创建它们。 br />
例如,我可以使用Observable.create(observer)
取得良好的结果:
a = Rx.Observable.create(obs => {
setInterval(() => {
obs.next('tick');
}, 500)
})
s = a.subscribe(v => console.log(v))
为我提供预期的输出(每500毫秒{tick
)
但是当我将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();
我仍然无法强迫它发出值。
我知道主题被设计为从外界接收值(而不是在内部将其作为Observable生成),因此主题应由带有subject.next('value')
的外部代码触发,但我只是想知道,如果它们与Observable严格相关,create
之后的逻辑以及进一步的行为应相同...
任何人都可以解释一下,为什么在create
上使用Subject
(即使不是为了这种方式工作,但仍然有可能)却不能按预期的方式工作?