创建操作符

  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. 内部的每个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.输出单一值

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


转换操作符

  1. concatMap(将源Observable的每个值映射为一个新的Observable,只有前一个值对应的Observable完成后才会开始订阅下一个值的Observable)
  2. concatMapTo(与concatMap功能类似,但是会将源Observable的值输出为固定值)
//下面的例子,外部源Observable每2秒输出一个值,经过concatMap后,再延迟5秒输出值
const source = interval(2000);
source
.pipe(concatMap((val) => of(val).pipe(delay(5000))))
.subscribe((r) => {
console.log(r);
});

//7秒后输出第一个值,之后每5秒继续输出
//7000ms-> 0 -12000ms-> 1 -17000ms-> 2 -22000ms-> 3
注意:如果源数据的会无穷的输出值并且比project的速度要快,就会使外部源的值挤压在内存区等待订阅,因此会产生内存问题,比如上面这个例子,如果长时间运行就会产生内存问题
  1. mergeMap(将源Observable的每个值映射为一个新的Observable,与concanMap的区别是,内部的所有Observable会同时开始订阅)
  2. mergeMapTo
//下面的例子,外部源Observable每2秒输出一个值
//经过mergeMap后,内部同时订阅所有的Observable,内部再等待5s后会同时开始输出所有的值
const source = interval(2000);
source
.pipe(mergeMap((val) => of(val).pipe(delay(5000))))
.subscribe((r) => {
console.log(r);
});

//7秒后输出第一个值,之后每2秒继续输出
//7000ms-> 0 -9000ms-> 1 -11000ms-> 2 -13000ms-> 3
  1. switchMap(将源Observable的每个值映射为一个新的Observable,与mergeMap的区别是,内部只会维护一个Observable,当下一个Observable开始时会取消前一个Observable)
  2. exhaustMap(将源Observablede值,按照project的规则进行输出,若当前值还没有输出完毕,新到达的值会被忽略掉)
//下面的例子,源值在经过exhaustMap时会先延迟1s输出,再延迟后输出值时正好源Observable的下一个值抵达,此时会被忽略掉
const source = interval(1000);
source
.pipe(exhaustMap((val) => of(val).pipe(delay(1000))))
.subscribe((r) => {
console.log(r);
});
//2000ms-> 0 -4000ms->2 -6000ms->4
concatMap,mergeMap,switchMap,exhaustMap务必区分它们不同的用法
这四个操作符的共同点都是会针对源Observable的每个值映射为一个单独的内部Observable,但是在合并输出Observable时有自己不同的规则
concatMap:前一个值的Observable完成后才会开始下一个,顺序输出这些Observable(有序的),一些极端情况下会积压待订阅的Observable,会存在内存问题
mergeMap:同时订阅值对应的所有Observable并且输出,内部会维护很多Observable所以会有内存的问题
switchMap:内部维护一个Observable,当新的值抵达时,会取消前一个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