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

23

这个主题的文档很少,而且很难找到“入口点”。

1个回答

50
语义因主题类型而异。我将它们分为两种:普通(Rx.Subject)和特殊用途的主题(另外三种)。特殊用途的主题与普通主题共享部分语义,但由于其专业化(例如完成/重新连接行为),存在一些注意事项。 普通 Rx.Subject 语义
  1. 主要特点

    • 主题实现观察者、可观察接口(以及一次性接口,因为它们的原型上有一个dispose处理程序)。这意味着,它们具有:
      • 观察者接口:onNextonErroronComplete方法
      • 可观察接口:subscribe方法
    • 您可以将主题转换为观察者或可观察对象,隐藏额外接口的实现(请参见.asObserver().asObservable()),如果需要。
    • 作为可观察对象,您可以向其订阅多个观察者。然后,该可观察对象将向所有观察者广播其数据。在内部,主题维护一个观察者数组。
    • 作为观察者的主题,您可以将其订阅到任何可观察对象
    • 组成主题的观察者和可观察对象是两个不同的实体,如果这是您的用例,您可以独立使用它们。
    • dispose主题将取消订阅所有观察者并释放资源。
    • 主题不需要调度程序,而是假定所有序列化和语法正确性都由主题的调用方处理。
    • 主题的默认行为是同步地向观察者发出其值,从第一个订阅的观察者开始到最后一个。在大多数情况下,顺序不重要,在其他情况下,则很重要。
我引用Rxjs合同和语法的一个关键方面:
这个语法允许可观察序列向订阅的观察者实例发送任意数量(0或更多)的onNext消息,随后是一个单独的成功(onCompleted)或失败(onError)消息。
  • 一个普通的主题(使用new Rx.Subject()创建)实现了这个语法:当onCompleted被调用一次后,所有后续调用onNext都会被忽略。同一个观察者上的第二次onCompleted调用也会被忽略。如果观察者订阅了主题的可观察侧面,它的onComplete回调将立即被调用(http://jsfiddle.net/cLf6Lqsn/1/)。

    1. 创建

      • new Rx.Subject()

    返回一个将其观察者连接到其可观察对象的主题(jsfiddle)。此示例摘自官方文档,展示了如何使用主题作为代理。主题订阅了一个源(观察者侧),同时也被观察者监听(可观察侧)。任何对onNext(观察者侧)的调用都会导致可观察侧向每个观察者调用onNext并传递相同的值。

    • Rx.Subject.create(observer, observable)

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

专门的 Rx.Subject 语义

希望我没有犯太多错误。如果有错误,请指正。最后一点,这适用于 RxJS v4。

有关冷/热可观察对象行为的详细说明,可以参考:热和冷可观察对象:是否存在“热”和“冷”运算符?


5
非常感谢。这个回答应该被放在RxJS的文档中,链接在这里:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md 你可以提交一个PR来添加它吗? - HipsterZipster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接