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

标签 javascript rxjs rxjs5

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

最佳答案

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

Vanilla Rx.Subject 语义

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

  • 我引用了 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/ )。
  • 创建
  • new Rx.Subject()

  • 返回一个将其观察者与其可观察对象( jsfiddle )联系起来的主题。本示例取自官方 documentation并描绘了如何使用主题作为代理。主题订阅源(观察者端),并且也被观察者(可观察端)监听。任何调用 onNext (观察者端)导致可观察端调用 onNext每个观察者的值都相同。
  • Rx.Subject.create(observer, observable)

  • 从指定的观察者和可观察对象创建一个主题。这两者没有必然联系。在 Rx.Dom.fromWebSocket 的实现中可以看到一个很好的例子。它返回用于从套接字发送和接收数据的主题。主体的观察者端向套接字发送数据。可观察端用于监听来自套接字的传入数据。此外,以这种方式创建的主题没有 dispose方法。
    专门的 Rx.Subject 语义
  • reactivex.io documentation涵盖了专业学科的大部分语义。
  • 其他值得提及的有趣点涉及完成后的行为。
  • 说明行为的示例代码在这里用于 async , behavior , replay

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

    有关冷/热 observables 行为的详细解释,可以引用:Hot and Cold observables : are there 'hot' and 'cold' operators?

    关于javascript - 不同 RxJS 主题的语义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34849873/

    相关文章:

    angular - 在 RxJs Observable 中包装一个 API 函数

    javascript - RXJS - throttle 时间不 throttle

    javascript - 组合 Observables - 等待所有 observables 触发

    javascript - 带有/登录选项卡链接的 Bootstrap 导航丸不起作用

    javascript - 将canvas转换为base64错误

    javascript - 我想在 v-for 标记中设置一个自定义属性,如下面的代码所示,但是如何在 `computed` 方法中获取此属性?

    javascript - 如何使用 JavaScript 和 HTML 开发复选框表单?

    angular - RxJS - 告诉 observable 等待其他 observable 发出非空值

    javascript - RxJS 5 - websocket 数组消息

    javascript - 我如何将 `do` 用作 RxJS 可出租运算符?