该主题的文档很少,很难在那里找到“入口点”。
1 回答
语义根据主题的类型而有所不同。我将它们分为两种:普通主题(Rx.Subject
)和专用主题(其他三种)。由于它们的专业化(例如,完成/重新连接行为),特殊目的主题与普通主题共享部分语义,但有一些注意事项。
Vanilla Rx.Subject 语义
主要特点
- 主体实现观察者,可观察接口(和一次性接口,因为他们
dispose
的原型上有一个处理程序)。这意味着,除其他外,他们有:- 观察者接口 :
onNext
,onError
,onComplete
方法 - 可观察接口:
subscribe
方法
- 观察者接口 :
- 您可以将主题投射到观察者或可观察者,如果需要隐藏额外接口(参见
.asObserver()
和)的实现.asObservable()
- 主题是可观察的,您可以订阅多个观察者。然后,该 observable 会将其数据广播给所有观察者。在内部,对象维护着一组观察者。
- 主题是观察者,您可以将其订阅到任何可观察对象
- 构成主题的观察者和可观察者是两个不同的实体,如果这是您的用例,您可以独立于另一个使用它们。
dispose
一个主题将取消订阅所有观察者并释放资源。- 主题不使用调度程序,而是假设所有序列化和语法正确性都由主题的调用者处理。
- 主体的默认行为是将它们的值同步发送给观察者,从第一个订阅的观察者开始到最后一个。在大多数情况下,顺序无关紧要,在其他情况下会。
- 主体实现观察者,可观察接口(和一次性接口,因为他们
我引用了Rxjs 契约和语法的一个关键方面:
此语法允许可观察序列向订阅的观察者实例发送任意数量(0 或更多)的 onNext 消息,可选地后跟单个成功(onCompleted)或失败(onError)消息。
一个香草主题(用创建
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
文档很好地涵盖了专业主题的大部分语义。 - 提到的其他有趣点涉及完成后的行为。
- 说明行为的示例代码在这里用于async,behavior,replay
希望我没有弄错太多。我会很高兴得到纠正。最后一点,这应该对 RxJS v4 有效。
有关冷/热 observables 行为的详细说明,可以参考:Hot and Cold observables : are there's 'hot' and 'cold' operator?