不同RxJS科目的语义是什么?

时间:2016-01-18 08:09:31

标签: javascript rxjs rxjs5

该主题的文档稀少,很难在那里发现“入口点”。

1 个答案:

答案 0 :(得分:39)

语义因主题类型而异。我将它们分为两种:香草(Rx.Subject)和特殊目标(其他三种)。由于专业化(例如,完成/重新连接行为),特殊目的主题与香草主题的语义共享部分注意事项(例如,完成/重新连接行为)。

Vanilla Rx.Subject语义

  1. 主要功能

    • 主题实现观察者,可观察的界面(和一次性界面,因为他们的原型上有dispose处理程序。这意味着,除其他外,他们有:
      • 观察者界面:onNextonErroronComplete方法
      • 可观察的界面:subscribe方法
    • 您可以将主题投射到观察者或观察者,隐藏额外界面的实现(参见.asObserver().asObservable()),如果需要的话
    • 主题是一个可观察的,你可以订阅几个观察者。然后,该观察者将向其所有观察员广播其数据。在内部,主体维持着一系列观察者。
    • 作为观察者的主体,您可以将其订阅到任何可观察的
    • 观察者和组成该主题的观察者是两个不同的实体,如果你的用例是你可以独立使用它们。
    • dispose主题将unsubscribe all observers and release resources.
    • 主题不采用调度程序,而是假设all serialization and grammatical correctness are handled by the caller of the subject.
    • 主题的默认行为是将同步的值发送给观察者,从第一个订阅的观察者开始到最后一个。在大多数情况下,订单无关紧要,在其他情况下也会如此。
  2. 我引用Rxjs contract and grammar的一个关键方面:

      

    此语法允许可观察序列将任何数量(0或更多)的onNext消息发送到订阅的观察者实例,可选地后跟一个成功(onCompleted)或失败(onError)消息。

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

      1. 创建

        • new Rx.Subject()
      2. 返回将其观察者连接到其可观察对象(jsfiddle)的主题。此示例取自官方documentation,并描述了如何将主题用作代理。主题订阅了一个来源(观察者一方),并且也被观察者(可观察的一方)收听。对onNext(观察者方)的任何调用都会导致可观察方调用onNext,并为每个观察者提供相同的值。

        • Rx.Subject.create(observer, observable)

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

    专门的Rx.Subject语义

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

    有关冷/热可观测量行为的详细说明,可以参考:Hot and Cold observables : are there 'hot' and 'cold' operators?