不同的 RxJS 主题的语义是啥?

Posted

技术标签:

【中文标题】不同的 RxJS 主题的语义是啥?【英文标题】:What are the semantics of different RxJS subjects?不同的 RxJS 主题的语义是什么? 【发布时间】:2016-04-23 08:06:00 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

Vanilla Rx.Subject 语义

    主要特点

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

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

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

一个普通主题(使用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?

【讨论】:

这是一个很好的答案。它属于这里的 RxJS 文档:github.com/Reactive-Extensions/RxJS/blob/master/doc/… 你可以在那里做一个 PR 来添加它吗? @user3743222

以上是关于不同的 RxJS 主题的语义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

请问大家常说的对HTML语义化的理解是啥?

关于spring webflow执行键的困惑,背后的语义是啥

“值语义”和“指针语义”是啥意思?

语义网络分析需要建立语料库吗

Go 中的“值语义”和“指针语义”是啥意思?

“语义”是啥意思?为啥“移动语义”这样命名,而不是任何其他术语?