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

IT技术 javascript rxjs rxjs5
2021-01-14 20:56:56

该主题的文档很少,很难在那里找到“切入点”。

1个回答

语义因主题类型而异。我将它们分为两种:普通 ( Rx.Subject) 和特殊用途科目(其他三种)。由于它们的专业化(例如,完成/重新连接行为),特殊目的主题共享原版主题的部分语义,但有一些警告。

Vanilla Rx.Subject 语义

  1. 主要特点

    • 主体实现了观察者、可观察接口(以及一次性接口,因为它们dispose的原型上有一个处理程序)。这意味着,除其他外,他们有:
      • 观察者接口:onNext, onError,onComplete方法
      • 可观察接口:subscribe方法
    • 您可以将主题转换为观察者或可观察对象,如果需要,隐藏额外接口的实现(参见.asObserver(), 和.asObservable()
    • 主题是可观察的,您可以订阅多个观察者。然后该 observable 将其数据广播给所有观察者。在内部,主题维护着一组观察者。
    • 主体是观察者,您可以将其订阅到任何可观察对象
    • 构成主题的观察者和可观察对象是两个不同的实体,如果这是您的用例,您可以独立使用它们。
    • disposeing 一个主题将取消订阅所有观察者并释放资源。
    • 主题不接受调度程序,而是假设所有序列化和语法正确性都由主题的调用者处理。
    • 主题的默认行为是将它们的值同步发送给观察者,从第一个订阅的观察者开始到最后一个在大多数情况下,顺序无关紧要,而在其他情况下则无关紧要。

我引用了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 语义

  • reactivex.io文档很好地涵盖了专业主题的大部分语义。
  • 其他值得提及的有趣点涉及完成后的行为。
  • 说明行为的示例代码在这里用于异步行为重放

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

有关冷/热 observables 行为的详细解释,可以参考:Hot 和 Cold observables :是否有“热”和“冷”运算符?

这是一个很好的答案。它属于这里的 RxJS 文档:github.com/Reactive-Extensions/RxJS/blob/master/doc/...你能在那里做一个 PR 来添加它吗?@用户3743222
2021-03-26 20:56:56