Rxjs的探索之路(合并类api)
Api功能分类
- 创建类(creation)
- 转化类(transformation)
- 过滤类(filtering)
- 合并类(combination)
- 多播类(multicasting)
- 错误处理类(error Handling)
- 辅助⼯具类(utility)
- 条件分⽀类(conditional&boolean)
- 数学和合计类(mathmatical&aggregate)
转换类(combination)
1.concat
concat的⼯作⽅式是这样:
- 从第⼀个Observable对象获取数据,把数据传给下游。对于实例操 作符⽤法,第⼀个Observable就是调⽤concat的那个对象;对于静态操作符 ⽤法,第⼀个Observable是concat第⼀个参数。
- 当第⼀个Observable对象complete之后,concat就会去subscribe第⼆ 个Observable对象获取数据,把数据同样传给下游。
- 依次类推,直到最后⼀个Observable完结之后,concat产⽣的 Observable也就完结了。
1 | import { concat, of } from "rxjs"; |
2.merge
1 | import { map, merge, take, timer } from "rxjs"; |
source3$中的数据永远不会获得进⼊merged$的机会,因为merge最后⼀个参数是2,也就限定了同时只能同步合并两个Observable对象的数据,source1$和source2$排在前⾯,所以优先合并它们两个,只有source1$和source2$其中之⼀完结的时候,才能空出⼀个名额来给source3$,可是source1$和source2$又不会完结,所以source3$没有出头之⽇。
1 | import { map, merge, take, timer } from "rxjs"; |
3.zip
1 | import { of, zip } from "rxjs"; |
1 | import { interval, of, zip } from "rxjs"; |
4.combineLatest
1 | import { combineLatest, timer } from "rxjs"; |
5.withLatestForm
- 在第0毫秒时刻,source1$吐出数据100,source2$没有吐出数据, 所以没有给下游产⽣数据。
- 在第500毫秒时刻,source2$吐出数据0,但是source2$并不直接触 发给下游传递数据,所以依然没有给下游产⽣产⽣数据。
- 在第1500毫秒时刻,source2$吐出数据1,同样不会给下游产⽣数 据。
- 在第2000毫秒时刻,source1$吐出数据100,这个数据会加上 source2$吐出的最后⼀个数据1,产⽣传给下游的数据101。
- 在第2500毫秒时刻,source2$吐出数据2,不会给下游产⽣数据。
- 在第3500毫秒时刻,source2$吐出数据3,不会给下游产⽣数据。
- 在第4000毫秒时刻,source1$吐出数据200,这个数据加上 source2$吐出的最后⼀个数据3,产⽣传给下游的的数据203。
1 | import { map, timer, withLatestFrom } from "rxjs"; |
在输出中,所有输出的百位数由source1贡献,个位数由source2贡献。可以看到,source2虽然产⽣的是连续递增的整数序列,但并不是所 有数据都进⼊了最终结果,很明显2和4就没有出现在最终结果的个位。⽽ source1$产⽣的数据,除了第⼀个0,其余全部出现在了最终结果的百位。
6.race
1 | import { map, race, timer } from "rxjs"; |
7.startWith
1 | import { of, startWith } from "rxjs"; |
8.forkJoin
1 | import { forkJoin, of } from "rxjs"; |
9.concatAll,mergeAll,zipAll,combineAll
1 | import { concatAll, interval, map, take } from "rxjs"; |
10.switchAll
switch的含义就是“切换”,总是切换到最新的内部Observable对象获取 数据。每当switch的上游⾼阶Observable产⽣⼀个内部Observable对象, switch都会⽴刻订阅最新的内部Observable对象上,如果已经订阅了之前的 内部Observable对象,就会退订那个过时的内部Observable对象,这个“⽤ 上新的,舍弃旧的”动作,就是切换。
1 | import { interval, map, switchAll, take } from "rxjs"; |
11.exhaustAll
连接⾼阶Observable产⽣的内部Observable对象,但是exhaust的策略和switch相反,当内部Observable对象在时间上发⽣重叠时,情景就是前⼀个内部Observable还没有完结,⽽新的Observable又已经产⽣,到底应该选择哪⼀个作为数据源?switch选择新产⽣的内部Observable对象,exhaust则选择前⼀个内部Observable对象。
1 | import { exhaustAll, interval, map, take } from "rxjs"; |