跳转至

Subject是一种桥梁或者代理,在一些针对ReactiveX的实现中,它可既是观察者也是可观察对象。作为观察者,它可以订阅一个或多个可观察对象。作为可观察对象,它也可以重复发出事件,也可以发出新事件。

因为Subject订阅了一个可观察对象,它在订阅后就会触发可观察对象开始发出事件。这可以让一个原本是冷可观察对象变成一个热可观察对象。

参考资料

Subject的变体

有四种变体,应用于某些特殊情况下。但不是所有的实现中都使用了它们。某些实现中使用的名称可能有些不同,例如在RxScala中,Subject被称为PublicSubject

AsyncSubject

AsyncSubject

一个AsyncSubject在源可观察对象发出完成通知后才发出源可观察对象的最后一个事件和它的完成通知。如果源可观察对象没有发出任何事件,AsyncSubject不发出任何事件,但会发出完成或者错误通知。

AsyncSubject

参考

BehaviorSubject

behaviorSubject

当一个观察者订阅了一个BehaviorSubject后,它会收到订阅前源可观察对象发出的最近一个事件,以及订阅后的所有事件。

behaviorSubjectWithError

参考

PublishSubject

PublishSubject

观察者如果订阅了PublishSubject,它可接收到自订阅之后发生的所有事件。

PublishSubjectWithError

如果你不想漏掉订阅之前的那些事件,可以选择创建一个冷可观察对象或者使用ReplaySubject

ReplaySubject

replaySubject

ReplaySubject向订阅它的所有观察者发送所有它所发出的事件,不管观察者是从什么时候开始订阅它。

使用ReplaySubject作为观察者时,不要从多个线程中调用它的onNexton方法,因为这样产生的不一致会违反可观察对象的条约规定,对先重发事件还是先重发通知产生二义性。

参考