Subject
是一种桥梁或者代理,在一些针对ReactiveX
的实现中,它可既是观察者也是可观察对象。作为观察者,它可以订阅一个或多个可观察对象。作为可观察对象,它也可以重复发出事件,也可以发出新事件。
因为Subject
订阅了一个可观察对象,它在订阅后就会触发可观察对象开始发出事件。这可以让一个原本是冷可观察对象变成一个热可观察对象。
参考资料¶
- To Use or Not to Use Subject from Dave Sexton’s blog
- Introduction to Rx: Subject
- 101 Rx Samples: ISubject
and ISubject - Advanced RxJava: Subject by Dávid Karnok
- Using Subjects by Dennis Stoyanov
Subject的变体¶
有四种变体,应用于某些特殊情况下。但不是所有的实现中都使用了它们。某些实现中使用的名称可能有些不同,例如在RxScala
中,Subject
被称为PublicSubject
。
AsyncSubject¶
一个AsyncSubject
在源可观察对象发出完成通知后才发出源可观察对象的最后一个事件和它的完成通知。如果源可观察对象没有发出任何事件,AsyncSubject
不发出任何事件,但会发出完成或者错误通知。
参考¶
BehaviorSubject¶
当一个观察者订阅了一个BehaviorSubject
后,它会收到订阅前源可观察对象发出的最近一个事件,以及订阅后的所有事件。
参考¶
PublishSubject¶
观察者如果订阅了PublishSubject
,它可接收到自订阅之后发生的所有事件。
如果你不想漏掉订阅之前的那些事件,可以选择创建一个冷可观察对象或者使用ReplaySubject
ReplaySubject¶
ReplaySubject
向订阅它的所有观察者发送所有它所发出的事件,不管观察者是从什么时候开始订阅它。
使用ReplaySubject
作为观察者时,不要从多个线程中调用它的onNext
和on
方法,因为这样产生的不一致会违反可观察对象的条约规定,对先重发事件还是先重发通知产生二义性。