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

What are the semantics of different RxJS subjects?

该主题的文档很少,很难在那里找到 "entry-point"。

语义因主题类型而异。我将它们分为两种:vanilla (Rx.Subject) 和 special-purpose 科目(其他三个)。 special-purpose 主题共享香草主题的部分语义,但由于它们的专业化(例如,completion/reconnection 行为)而有一些警告。

原版 Rx.Subject 语义

  1. 主要特点

    • subjects 实现观察者、可观察接口(以及一次性接口,因为它们的原型上有一个 dispose 处理程序)。这意味着,除其他外,他们有:
      • 观察者界面:onNextonErroronComplete方法
      • 可观察接口:subscribe方法
    • 如果需要,您可以将主题转换为观察者或可观察对象,隐藏额外接口的实现(参见 .asObserver(), and .asObservable()
    • 主题是一个可观察对象,您可以订阅多个观察者。然后,该可观察对象会将其数据广播给所有观察者。在内部,主题维护一个观察者数组。
    • 主题是一个观察者,你可以订阅任何观察者
    • 构成主题的观察者和可观察对象是两个不同的实体,如果这是您的用例,您可以独立于另一个使用它们。
    • dispose学习一个主题会 unsubscribe all observers and release resources.
    • 受试者不接受调度程序,而是假设 all serialization and grammatical correctness are handled by the caller of the subject.
    • 主题的默认行为是同步向观察者发出它们的值,从第一个订阅的观察者开始到最后一个。在大多数情况下,顺序无关紧要,在其他情况下它会。

我引用 Rxjs contract and grammar 的一个关键方面:

This grammar allows observable sequences to send any amount (0 or more) of onNext messages to the subscribed observer instance, optionally followed by a single success (onCompleted) or failure (onError) message.

  • 普通主题(使用 new Rx.Subject() 创建)实现了该语法:当 onCompleted 被调用一次时,所有后续对 onNext 的调用都将被忽略。对同一观察者第二次调用 onCompleted 也会被忽略。如果观察者订阅了主题的可观察端,它的 onComplete 回调将立即被调用 (http://jsfiddle.net/cLf6Lqsn/1/).

    1. 创作

      • new Rx.Subject()

    Returns 一个将其观察者连接到其可观察对象的主题(jsfiddle). This example is taken from the official documentation 并描绘了如何将主题用作代理。该主题订阅了一个源(观察者端),并且也被收听由观察者(可观察端)打开。任何对 onNext(观察者端)的调用都会导致可观察端调用 onNext,每个观察者的值都相同。

    • Rx.Subject.create(observer, observable)

    从指定的观察者和可观察者创建一个主题。这两者没有必然联系。在 Rx.Dom.fromWebSocket 的实现中可以看到一个很好的例子,其中 returns 一个主题用于从套接字发送和接收数据。主题的观察者端向套接字发送数据。可观察端用于侦听来自套接字的传入数据。此外,以这种方式创建的主题没有 dispose 方法。

专门Rx.Subject语义

希望我没有弄错太多。我很乐意得到纠正。最后请注意,这应该对 RxJS v4 有效。

关于cold/hot observables行为的详细解释,可以参考: