
操作符与转换
|
83
//B
flatMap(innerObs -> just(innerObs)
.delay(rnd.nextInt(5), SECONDS))
在变种
A
中,Observable 会立即出现在外层流中,但是在一定延迟之后才会发布事件。
在变种
B
中,我们及时转移了整个 Observable 的事件,所以它出现在外层 Observable
中的时间要晚得多。现在,已经介绍了为何需要这么复杂的操作符。静态的 concat()
和 merge() 操作符都能操作由固定列表组成的 Observable,或者由 Observable 组成的
Observable
。而对
switchOnNext()
来说,后者会生效。
switchOnNext() 首先会订阅一个外层的 Observable<Observable<T>>,这个外层 Observable
会发布内层的 Observable<T>。第一个内层 Observable<T> 出现的时候,这个操作符就
会订阅它并开始往下游推送 T 类型的事件。下一个内层 Observable<T> 出现的话,会发
生什么呢? switchOnNext() 将会取消对第一个 Observable<T> 的订阅,从而丢弃第一个
Observable<T>,然后切换至下一个 Observable<T>(这种做法也符合它的名称)。换句话
说,如果有一个用流组成的流时,switchOnNext() 只会往下游转发最后的内部流的事件,
即便旧的流依然在生成新的事件也会被丢弃。 ...