不同 RxJS 主题的语义是什么?
What are the semantics of different RxJS subjects?
该主题的文档很少,很难在那里找到 "entry-point"。
语义因主题类型而异。我将它们分为两种:vanilla (Rx.Subject
) 和 special-purpose 科目(其他三个)。 special-purpose 主题共享香草主题的部分语义,但由于它们的专业化(例如,completion/reconnection 行为)而有一些警告。
原版 Rx.Subject 语义
主要特点
- subjects 实现观察者、可观察接口(以及一次性接口,因为它们的原型上有一个
dispose
处理程序)。这意味着,除其他外,他们有:
- 观察者界面:
onNext
、onError
、onComplete
方法
- 可观察接口:
subscribe
方法
- 如果需要,您可以将主题转换为观察者或可观察对象,隐藏额外接口的实现(参见
.asObserver()
, and .asObservable()
)
- 主题是一个可观察对象,您可以订阅多个观察者。然后,该可观察对象会将其数据广播给所有观察者。在内部,主题维护一个观察者数组。
- 主题是一个观察者,你可以订阅任何观察者
- 构成主题的观察者和可观察对象是两个不同的实体,如果这是您的用例,您可以独立于另一个使用它们。
dispose
学习一个主题会 unsubscribe all observers and release resources.
- 受试者不接受调度程序,而是假设 all serialization and grammatical correctness are handled by the caller of the subject.
- 主题的默认行为是同步向观察者发出它们的值,从第一个订阅的观察者开始到最后一个。在大多数情况下,顺序无关紧要,在其他情况下它会。
我引用 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()
Returns 一个将其观察者连接到其可观察对象的主题(jsfiddle). This example is taken from the official documentation 并描绘了如何将主题用作代理。该主题订阅了一个源(观察者端),并且也被收听由观察者(可观察端)打开。任何对 onNext
(观察者端)的调用都会导致可观察端调用 onNext
,每个观察者的值都相同。
Rx.Subject.create(observer, observable)
从指定的观察者和可观察者创建一个主题。这两者没有必然联系。在 Rx.Dom.fromWebSocket
的实现中可以看到一个很好的例子,其中 returns 一个主题用于从套接字发送和接收数据。主题的观察者端向套接字发送数据。可观察端用于侦听来自套接字的传入数据。此外,以这种方式创建的主题没有 dispose
方法。
专门Rx.Subject语义
- 这
reactivex.io
documentation 很好地涵盖了专业主题的大部分语义。
- 其他有趣的要点涉及完成后的行为。
- 说明行为的示例代码位于 async, behavior, replay
希望我没有弄错太多。我很乐意得到纠正。最后请注意,这应该对 RxJS v4 有效。
关于cold/hot observables行为的详细解释,可以参考:
该主题的文档很少,很难在那里找到 "entry-point"。
语义因主题类型而异。我将它们分为两种:vanilla (Rx.Subject
) 和 special-purpose 科目(其他三个)。 special-purpose 主题共享香草主题的部分语义,但由于它们的专业化(例如,completion/reconnection 行为)而有一些警告。
原版 Rx.Subject 语义
主要特点
- subjects 实现观察者、可观察接口(以及一次性接口,因为它们的原型上有一个
dispose
处理程序)。这意味着,除其他外,他们有:- 观察者界面:
onNext
、onError
、onComplete
方法 - 可观察接口:
subscribe
方法
- 观察者界面:
- 如果需要,您可以将主题转换为观察者或可观察对象,隐藏额外接口的实现(参见
.asObserver()
, and.asObservable()
) - 主题是一个可观察对象,您可以订阅多个观察者。然后,该可观察对象会将其数据广播给所有观察者。在内部,主题维护一个观察者数组。
- 主题是一个观察者,你可以订阅任何观察者
- 构成主题的观察者和可观察对象是两个不同的实体,如果这是您的用例,您可以独立于另一个使用它们。
dispose
学习一个主题会 unsubscribe all observers and release resources.- 受试者不接受调度程序,而是假设 all serialization and grammatical correctness are handled by the caller of the subject.
- 主题的默认行为是同步向观察者发出它们的值,从第一个订阅的观察者开始到最后一个。在大多数情况下,顺序无关紧要,在其他情况下它会。
- subjects 实现观察者、可观察接口(以及一次性接口,因为它们的原型上有一个
我引用 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()
Returns 一个将其观察者连接到其可观察对象的主题(jsfiddle). This example is taken from the official documentation 并描绘了如何将主题用作代理。该主题订阅了一个源(观察者端),并且也被收听由观察者(可观察端)打开。任何对
onNext
(观察者端)的调用都会导致可观察端调用onNext
,每个观察者的值都相同。Rx.Subject.create(observer, observable)
从指定的观察者和可观察者创建一个主题。这两者没有必然联系。在
Rx.Dom.fromWebSocket
的实现中可以看到一个很好的例子,其中 returns 一个主题用于从套接字发送和接收数据。主题的观察者端向套接字发送数据。可观察端用于侦听来自套接字的传入数据。此外,以这种方式创建的主题没有dispose
方法。
专门Rx.Subject语义
- 这
reactivex.io
documentation 很好地涵盖了专业主题的大部分语义。 - 其他有趣的要点涉及完成后的行为。
- 说明行为的示例代码位于 async, behavior, replay
希望我没有弄错太多。我很乐意得到纠正。最后请注意,这应该对 RxJS v4 有效。
关于cold/hot observables行为的详细解释,可以参考: