这个主题的文档很少,而且很难找到“入口点”。
Rx.Subject
)和特殊用途的主题(另外三种)。特殊用途的主题与普通主题共享部分语义,但由于其专业化(例如完成/重新连接行为),存在一些注意事项。
普通 Rx.Subject 语义
主要特点
dispose
处理程序)。这意味着,它们具有:
onNext
、onError
、onComplete
方法subscribe
方法.asObserver()
和.asObservable()
),如果需要。dispose
主题将取消订阅所有观察者并释放资源。一个普通的主题(使用new Rx.Subject()
创建)实现了这个语法:当onCompleted
被调用一次后,所有后续调用onNext
都会被忽略。同一个观察者上的第二次onCompleted
调用也会被忽略。如果观察者订阅了主题的可观察侧面,它的onComplete
回调将立即被调用(http://jsfiddle.net/cLf6Lqsn/1/)。
创建
new Rx.Subject()
返回一个将其观察者连接到其可观察对象的主题(jsfiddle)。此示例摘自官方文档,展示了如何使用主题作为代理。主题订阅了一个源(观察者侧),同时也被观察者监听(可观察侧)。任何对onNext
(观察者侧)的调用都会导致可观察侧向每个观察者调用onNext
并传递相同的值。
Rx.Subject.create(observer, observable)
从指定的观察者和可观察对象创建一个主题。这两个对象不一定连接。可以在Rx.Dom.fromWebSocket
的实现中看到一个很好的例子,它返回一个用于从套接字发送和接收数据的主题。主题的观察者侧将数据发送到套接字。可观察侧用于监听来自套接字的传入数据。此外,使用这种方式创建的主题没有dispose
方法。
专门的 Rx.Subject 语义
reactivex.io
文档 很好地涵盖了大多数专门主题的语义。希望我没有犯太多错误。如果有错误,请指正。最后一点,这适用于 RxJS v4。
有关冷/热可观察对象行为的详细说明,可以参考:热和冷可观察对象:是否存在“热”和“冷”运算符?