这几个操作符都可以将多个Observable进行组合,那么它们有什么不同呢?
组合Observable发射一个值
首先我们来看如下的示例:
// combineLatest
const combineLatestExample = Rx.Observable.combineLatest(Rx.Observable.interval(1000).take(1),Rx.Observable.interval(2000).take(1))
combineLatestExample.subscribe(value => console.log(value))
// forkJoinExample
const forkJoinExample = Rx.Observable.forkJoin(Rx.Observable.interval(1000).take(1),Rx.Observable.interval(2000).take(1))
forkJoinExample.subscribe(value => console.log(value))
// zip
const zipExample = Rx.Observable.zip(Rx.Observable.interval(1000).take(1),Rx.Observable.interval(2000).take(1))
zipExample.subscribe(value => console.log(value))
三个的运行结果都为:[0,0]
。
由此可以得出:如果组合的Observable都emit一个值的话,这三个操作符示没有区别的。
那么,如果Observable都emit多个值结果又会发生什么变化呢?
组合Observable发射多个值
代码示例如下:
// combineLatest
const combineLatestExample = Rx.Observable.combineLatest(Rx.Observable.interval(1000).take(2),Rx.Observable.interval(2000).take(2))
combineLatestExample.subscribe(value => console.log(value))
// forkJoinExample
const forkJoinExample = Rx.Observable.forkJoin(Rx.Observable.interval(1000).take(2),Rx.Observable.interval(2000).take(2))
forkJoinExample.subscribe(value => console.log(value))
// zip
const zipExample = Rx.Observable.zip(Rx.Observable.interval(1000).take(2),Rx.Observable.interval(2000).take(2))
zipExample.subscribe(value => console.log(value))
运行结果
combineLatest:[1,0] [1,1]
forkJoin:[1,2]
zip:[0,0] [1,1]
由此可以得出:
combineLatest:组合的Observable任意一个emit数据时,将每个的最新值组合到一起
forkJoin:等到组合的Observable数据都发射完毕后,将最终的结果组合组合到一起
zip:将组合的Observable发射的数据按照顺序一一对应到一起。