rxjs合并数据流操作符

限于喜欢 提交于 2020-03-04 11:01:30

一、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$)

输出结果:

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!