,ReplaySubject
记录 Observable 执行中的历史值并将其回放给新的订阅者。
var subject = new Rx.ReplaySubject(3);
参数 表示缓存几个历史数据
假如参数是5, 也就是缓存5个值,订阅的时候可以收到过去发出的5个值。
官方文档:概览 | RxJS 中文文档
先来个简单的 merge :
1、其中 s.subscribe(r); 的作用是,如果 s.next() ,那么订阅 r 也会收到消息。
2、s.next('a') , 会触发 r.next('a'). 在 merge 的作用下,所以 all 会收到 两个 ’a‘,
3、s.next('b'), 同上
!! switchMap的作用是 : 每次 r 发出消息,都会产生一个新的sw-observable,就是switchMap 返回的那个,同时清除之前的sw-observable.
所以,如果switchMap后面的只是一个普通的Subject, 而不是ReplaySubject,是什么数据都没有的,因为是新的。只有是返回能记录历史数据的ReplaySubject,当生成新的订阅的时候才能收到数据,收到的是过去的数据。
继续 ReplaySubject :
如果换成 s.next('a') , s.next('b'), s.next('c'), 输出结果为 : a , a b , b c 五个数据
继续mergeMap
- next('a'), next('b') 放在const all= 后面,输出是:a ab ab
- next('a'),next('b') 放在 const all= 前面,输出是 ab * 4。
s.next -> r收到数据 -> 因为r数据变了所以switchMap新的订阅 (s数据没了,r还有) -> merge订阅的subject,不管谁next,最终all.subscribe的数据都是来自r