Rxjs操作符分类介绍

创建操作符

  1. defer(订阅时通过工厂函数创建Observable)
  2. form(创建一个Array、类数组对象、Promise、可迭代对象的Observable)
  3. formEvent(从 DOM 事件或 Node.js EventEmitter 事件或其它事件创建一个 Observable)
  4. interval(计时器)
  5. of
  6. range(创建一个发送指定长度递增的连续整数)
  7. timer(定时器/计时器)
  8. iif(返回一个布尔值,从两个Observable中选择一个)

联结创建操作符

  1. combineLatest(订阅内部所有的Observable,每个Observable都至少发送一个值后,外部Observable才发送值的集合,直到内部所有的Observable都完成)
  2. zip(订阅内部所有的Observable,每个Observable都至少发送一个值后,外部Observable才发送值的集合,直到内部任意一个Observable完成,则外部Observable完成)
1
2
3
4
5
6
7
相同点:
1. 内部的每个Observable至少发送一个值才输出外部的Observable,否则不输出任何值

区别:
1.combineLatest:内部所有的Observabale都完成,外部的Observable才完成
2.zip:只要一个内部的Observable完成,则外部的Observable完成


  1. forkJoin(订阅内部所有的Observable,内部所有的Observable都完成后统一发出最新值的集合)

  1. concat(订阅内部所有的Observable.顺序输出内部Observable的每个值,前一个Observable完成后才会开始输出下一个Observable)
  2. merge(订阅内部所有的Observable,内部任意一个Observable发送值则外部就同步发送值,内部所有的Observable完成后,外部Observable才完成)
1
2
相同点:
1.输出单一值

  1. partition(类似filter,返回两个Observable,一个符合条件的Observable,另一个不符合条件的Observable)
  2. race(使用首个发出值的Observable)

转换操作符

  1. concatMap(将源Observable的每个值映射为一个新的Observable,只有前一个值对应的Observable完成后才会开始订阅下一个值的Observable,串行处理。)
  2. concatMapTo(与concatMap功能类似,但是会将源Observable的值输出为固定值)
1
注意:如果源数据的会无穷的输出值并且比project的速度要快,就会使外部源的值积压在内存区等待订阅,因此会产生内存问题
  1. mergeMap(将源Observable的每个值映射为一个新的Observable,与concanMap的区别是,内部的所有Observable会同时开始订阅,并发处理。)
  2. mergeMapTo
1
注意:如果不限制并发数量,会导致大量的Observable并发处理,会有内存泄露风险
  1. switchMap(将源Observable的每个值映射为一个新的Observable,当下一个Observable开始时会取消前一个Observable)
  2. exhaustMap(将源Observablede值,按照project的规则进行输出,若当前值还没有输出完毕,新到达的值会被忽略掉)
1
2
3
4
5
6
concatMap,mergeMap,switchMap,exhaustMap务必区分它们不同的用法

concatMap:前一个值的Observable完成后才会开始下一个,顺序输出这些Observable(有序的),一些极端情况下会积压待订阅的Observable,会存在内存问题
mergeMap:同时订阅值对应的所有Observable并且输出,内部会维护很多Observable所以会有内存泄露的问题
switchMap:当新的值抵达时,会取消当前活跃的Observable并订阅新的Observable
exhaustMap:当前Observable未完成前会忽略新抵达值的Observable

  1. expand(将源Observable的值,递归调用project函数)
  2. pairwise(将当前值和先前值放在一起作成一个数组,并发送它.只有再第二个值时才开始发送,因为第一个值没有前一个值)
  3. pluck(将每个源值映射到其指定的嵌套属性)
  4. groupBy

  1. scan(与reduce 函数类似)
  2. switchScan
  3. mergeScan

  1. map(与Array.prototype.map 函数类似,映射每一个值)
  2. mapTo(与Array.prototype.map 函数类似,映射每一个值至常量)

过滤操作符

  1. auditTime(在 duration 毫秒内忽略源值,然后从源 Observable 发送最新值)
  2. debounceTime(舍弃掉两次输入之间小于指定时间的值,用于防抖)
  3. throttleTime(忽略指定之间内的值,用于节流)

  1. distince(发送订阅的Observable中没有的值)
  2. distinctUntilChanged(发送订阅的Observable与前一个值不相等的值,使用===)
  3. distinctUntilKeyChanged(根据键值比较与前一个值是否相等,并返回)

  1. take(只发送源Observable的N个值)
  2. takeLast(源Observable完成,然后取最后N个值,源Observable完成时生效)
  3. takeWhile(源Observable的值不满足条件时,完成源Observable,注意区分filter)
  4. takeUntil(当提供的Observable发出值时,完成源Observable)

  1. skip(跳过开头的值)
  2. skipLast(源Observable完成前跳过最后指定数量的值,源Observable完成时生效)
  3. skipUntil(跳过源Observable的值,直到第二个Observable开始发送值)
  4. skipWhile(跳过源Observable的值,直到表达式为fals开始发送值)

  1. first(发出第一个值或最近到达的值)
  2. last(发出最后一个值)

  1. sample(每当提供的Observable发射值时,从源Observable中获取最近的值)
  2. sampleTime(周期性的从源Observable中获取最近的值,与sample类似)

  1. elementAt(发送源 Observable 的发送序列中位于指定 index 处的单个值)
  2. single(发出源Observable中符合表达式的单一值)
  3. filter(与Array.prototype.filter 方法类似)

多播操作符

  1. share(多播,转为热的Observable)
  2. publish