RxJS 6
操作符
一些常用的操作符
- of
- from
- first
- last
- tap
- interval
- timer
- forkJoin
- filter
- map
- switchMap
- scan
- takeWhile
- takeUtil
- take
- concat
- throttle
- debounce
- merge
of
将数字转化为 Observable
1 | Rx.of("1", "2").subscribe(v => console.log(v)); |
concat
前面的流执行完成在执行后面的流
1 | Rx.from(["x", "y", "z"]) |
输出
1 | concat: emit x |
forkJoin
类似Promise.all
, 同时执行多个流, 在所有流执行完成之后传递一个数据数组.
1 | Rx.forkJoin(fetchData(1), fetchData(2)).subscribe(r => |
mergeMap(flatMap)
流相乘
1 | Rx.of("a", "b", "c") |
输出
1 | 0a |
switchMap
当接收到新的流发出的信息, 会取消订阅前一个流, 在进行多次点击的情况并不会执行多次 log 而是输出最新的流返回的数据
1 | Rx.fromEvent(document, "click") |
takeUtil
用 takeUntil 接收一个通知流, 来控制另外一个流的结束,
1 | Rx.interval(1) |
输出
1 | 1 |
takeWhile
类似 js 中的while
语句, 当满足 takeWhile 的条件才会执行, 否则跳出循环结束流
1 | Rx.from(["iris", "diana", "appolo", "luna"]) |
输出
1 | iris |
buffer
将一个流的数据缓存到 buffer 中, 等待另一个流通知结束, 再将 buffer 的数据以数组的形式 emit 出来
1 | Rx.interval(0) |
debounceTime
防抖, 常用于持续触发的事件, 滚动等, 以下例子, 在没有数据输出, 等待 1s 后才会输出最后一条数据
1 | Rx.interval(0) |
throttleTime
节流, 以下例子, 每隔 1s 取一个数据, 所以输出的数字并不会连续
1 | Rx.interval(0) |
scan
类似 js 中的reduce
, 将累计值 和当前流传递发出的值进行 相加
, 然后保存到累计值
1 | Rx.of({ name: "xx", state: "inited" }) |