一、concat首尾相连
工作方式:
当第一个Observable对象complete之后,concat就会去subscribe第二个Observable对象获取数据,把同样的数据传给下游。
直到最后一个Observable完结之后,concat产生的Observable也就完结了。
import { of,concat } from 'rxjs';
...
const source1$ = of(1,2,3)
const source2$ = of(4,5,6)
const source$ = concat(source1$,source2$)
source$.subscribe(
console.log,
null,
()=>console.log('complete')
)
...
输出结果

二、merge:先到先得快速通过
工作方式:
第一个Observable对象不完结,并不影响下游的observable对象,随先得到,就先输出。
当所有的Observable对象完结了,merge才会完结自己的Observable对象。
import { timer, merge } from 'rxjs';
import 'rxjs/add/operator/map'
...
// 从第0毫秒开始,每隔1000毫秒产生一个数据,依次是:0A、1A、2A....
const source1$ = timer(0,1000).map( x=> x + 'A') // 从第500毫秒开始,每隔1000毫秒产生一个数据,依次是:0B、1B、2B...
const source2$ = timer(500,1000).map( x=> x+'B')
const source$ = merge(source1$,source2$)
source$.subscribe(
console.log,
null,
()=>console.log('complete')
)
...
输出结果前几个数值如下:

同步限流
merge有一个可选参数,放在最后。表示指定可以同时合并的observable对象个数。
如果前面两个observable对象没有完结,第三个Observable对象永远不会进入source$。
const source1$ = timer(0,1000).map( x=> x + 'A') const source2$ = timer(500,1000).map( x=> x+'B') const source3$ = timer(1000,1000).map( x=> x+'C') const source$ = merge(source1$,source2$,source3$,2)
merge的应用场景
fromEvent可以从网页中获取事件,但是fromEVent一次只能从一个DOM元素获取一种类型的事件。
如果某个元素的click事件,也同时需要touchend事件,因为移动设备上touchend事件出现得比click更早。
这两个事件的处理是一模一样的。
此时需要借助merge的力量。
const source1$ = fromEvent(document.querySelector('#text'),'click')
const source2$ = fromEvent(document.querySelector('#text'),'touchend')
const source$ = merge(source1$,source2$)
结论:
merge只对产生异步数据的Observable才有意义。
三、zip:拉链式组合
工作方式:
一对一合并,如果source1$吐出数据更快,也会等着source2$数据吐出后一对一配对输出。
即使source1$还有多余的数据,如果没有配对数据,将会执行complete完结。
因此会造成数据挤压问题。
zip也可以多个数据流合并。
import { of, zip } from 'rxjs';
const source1$ = of(1,2,3,4,5)
const source2$ = of('a','b','c')
const source$ = zip(source1$,source2$)
输出结果:

来源:https://www.cnblogs.com/hibiscus-ben/p/12408020.html