
42
|
第
2
章
AsyncSubject
记住发布的最后一个值,并且 onComplete() 被调用时,将其推送给所有的订阅者。如
果 AsyncSubject 没有完成,除了最后一个事件之外,所有的事件都会被丢弃。
BehaviorSubject
在订阅之后,将所有发布的事件推送给订阅者,与 PublishSubject 类似。但是,它首
先会发布在订阅之前发生的最新事件,从而让 Subscriber 立即得到流的状态。比如,
Subject 可能会代表当前的温度,每分钟广播一次。从客户端订阅的时候,他将立即接
收到最新的可见温度,而不用等待几秒再获得下一个事件。但是,同一个 Subscriber
只对最新的温度感兴趣,而不会对历史温度感兴趣。如果此时还没有发布过事件,并且
提供了默认事件,那么将会首先推送一个特殊的默认事件。
ReplaySubject
最有意思的 Subject 类型会缓存贯穿整个历史的推送事件。如果有人订阅,他首先
会接收到一批被错过(缓存)的事件,然后才会实时接收后续的事件。默认情况下,
Subject 创建之后的所有事件都会被缓存。如果流是无穷的或者非常长,这可能会非常
危险(参见
8.6
节)。在这种情况下,可以使用重载版本的 ReplaySubject,它只会保留
如下事件。
•
在内存中保留可配置数量的事件(createWithSize())。
•
配置最近事件的时间窗口(createWithTime())。
•
通过 createWithTimeAndSize() ...