什么是不同的RxJS主题的​​语义?

这个主题的文档是稀疏的,很难发现一个“入口点”。

语义根据主题的types而有所不同。 我将把它们分为两种:香草( Rx.Subject )和特殊目的(其他三种)。 由于专业化(例如,完成/重新连接行为),特殊用途科目共享部分香草科目的语义学,并提出一些注意事项。

香草Rx.Subject语义

  1. 主要特征

    • 主体实现观察者,可观察的接口(和一次性接口,因为他们的原型上有一个dispose处理程序)。 这意味着,除其他外,他们有:
      • 观察者接口: onNextonErroronComplete方法
      • 可观察的接口: subscribe方法
    • 你可以把一个主体投给观察者或观察者,隐藏额外接口的实现(参见.asObserver().asObservable() ),如果需要的话
    • 该主题是一个可观察的,你可以订阅几个观察员。 然后,这个可观察者将向所有的观察者广播其数据。 对象内部维护着一系列观察者。
    • 作为观察者的主题,你可以订阅任何观察
    • 观察者和构成主体的观察者是两个不同的实体,如果这是你的用例,你可以独立使用它们。
    • dispose主题将取消订阅所有观察者并释放资源。
    • 主题不采取调度程序,而是假定所有序列化和语法正确性由主题的调用者处理。
    • 主体的默认行为是同步地向观察者发出它们的值, 从第一个订阅的观察者开始到最后一个观察者 。 在大多数情况下,顺序不重要,在其他情况下。

我引用了Rxjs合同和语法的一个关键方面:

这个语法允许可观察的序列发送onNext消息的任意数量(0或更多)到订阅的观察者实例,可选地接着是单个成功(onCompleted)或失败(onError)消息。

  • 一个香草主题(使用new Rx.Subject()创build)实现该语法:当onCompleted被调用一次时,所有后续对onNext调用都被忽略。 在同一个观察者上onCompleted第二个调用也被忽略。 如果观察者订阅了主题的可观察侧,则其onCompletecallback将立即被调用( http://jsfiddle.net/cLf6Lqsn/1/ )。

    1. 创build

      • new Rx.Subject()

    返回一个将观察者连接到其observable( jsfiddle )的主题。 这个例子取自官方文档 ,描述如何使用主题作为代理。 主体订阅源(观察者一方),也被观察者(可观察方)聆听。 任何对onNext (观察者侧)的调用onNext导致可观察方调用onNext ,每个观察者的值都相同。

    • Rx.Subject.create(observer, observable)

    从指定的观察者和观察者创build一个主题。 这两个不一定是连接的。 在Rx.Dom.fromWebSocket的实现中可以看到一个很好的例子,它返回一个用于从套接字发送和接收数据的主题。 主题的观察者侧将数据发送到套接字。 可观察端用于侦听来自套接字的传入数据。 另外,以这种方式创build的主题不具有dispose方法。

专门的Rx.Subject语义

  • 这个reactivex.io文档涵盖了大部分专门主题的语义。
  • 其他有趣的一点是关注过去完成的行为。
  • 示例代码的示例代码在这里是为了asynchronous , 行为 , 重播

希望我没有太多错误。 我很乐意被纠正。 最后一点,这应该对RxJS v4有效。

要详细解释冷热观测值的行为,可以参考: 热和冷观测值:是否有“热”和“冷”的操作符?