Subject

Subject是一种桥接器或代理,可以在一些ReactiveX的某些实现中使用,它既充当观察者又充当事件源。因为它是一个观察者,它可以订阅一个或多个事件源,而且它又是一个事件源,它可以通过重新发送它观察到的事件来传递事件,并且它也可以发出新事件。

由于一个Subject订阅一个事件源,它可以触发这个事件源开始发出事件(如果那个事件源是"冷"的--就是说,它等待有订阅才开始发出事件)。因此有这样的效果,Subject可以把原来那个"冷"的事件源变成"热"的。

参考

Subject的种类

针对不同的场景一共有四种类型的Subject。他们并不是在所有的实现中全部都存在,而且一些实现使用其它的命名约定(例如,在RxScala中Subject被称作PublishSubject):

AsyncSubject

一个AsyncSubject只在源事件源完成后,发出来自源事件源的最后一个事件。它会把这最后一个事件发出给任何后续的观察者(如果源事件源没有发出任何事件,AsyncSubject 也不发出任何事件)。

然而,如果源事件源因为发生了错误而终止,AsyncSubject将不会发出任何事件,只是简单的传递这个错误通知。

参考

BehaviorSubject

当观察者订阅BehaviorSubject时,它开始发出源事件源最近发出的事件(如果此时还没有收到任何事件,它会发出一个默认值),然后继续发出其它任何来自源事件源的事件。

然而,如果源事件源因为发生了一个错误而终止,BehaviorSubject 将不会发出任何事件,只是简单的传递这个错误通知。

参考

PublishSubject

PublishSubject只会把来自源事件源的在订阅发生的时间点之后事件发出给观察者。

需要注意的是,PublishSubject可能会一创建完成就立刻开始发出事件(除非你可以阻止它发生),因此这里有一个风险:在Subject被创建后到有观察者订阅它之前这个时间段内,一个或多个事件可能会丢失。如果要确保来自源事件源的所有事件都被发出,你需要这样做:使用Create创建那个事件源以便手动给它引入"冷"事件源的行为(当所有观察者都已经订阅时才开始发出事件),或者改用ReplaySubject

如果源事件源因为发生了一个错误而终止,PublishSubject将不会发出任何事件,只是简单的传递这个错误通知。

ReplaySubject

ReplaySubject会发出所有来自源事件源的事件给观察者,无论它们是何时订阅的。

也有其它版本的ReplaySubject,在重放缓存增长到一定大小的时候或过了一段时间后会丢弃旧的事件(源事件源发出的)。

如果你把ReplaySubject当作一个观察者使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),这可能导致并行非有序调用,这会违反事件源合约,给Subject的重放事件活通知的结果增加了不确定性。

参考

Language-Specific Information:

待定

如果你有一个Subject并且想要将其传递给其他客户端而不暴露其Subscriber接口,则可以通过调用其asObservable方法来掩盖它,该方法将Subject返回为单纯的事件源。

参考

如果你有一个Subject并且想要将其传递给其他客户端而不暴露其Subscriber接口,则可以通过调用其asObservable方法来掩盖它,该方法将Subject返回为单纯的事件源。

参考

待定

参考

待定

待定

参考

待定

待定

待定