RXJS中CombineLatest/ForkJoin/Zip的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaoruda/article/details/83757026

这几个操作符都可以将多个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发射的数据按照顺序一一对应到一起。

猜你喜欢

转载自blog.csdn.net/zhaoruda/article/details/83757026