RxJS mergeMap,switchMap,concatMap

2,754 阅读1分钟

本文基于RxJS v6进行学习RxJS操作符之mergeMap,switchMap,concatMap

mergeMap

  • 合并多个Observable, 不会取消之前的流。

当main被订阅之后,source流每隔三秒进行触发一次,当触发的同时,内部的流也被触发,但source流每隔三秒触发后,之前没执行完的流并不会被中断。

// RxJS v6+
import { of, interval } from "rxjs";
import { mergeMap, take } from "rxjs/operators";

const source$ = interval(3000);
const main = source$
  .pipe(mergeMap(() => interval(500).pipe(take(10))))
  .subscribe(item => console.log(item));

switchMap

  • 合并多个Observable, 会取消之前的流。

当main被订阅之后,source流每隔三秒进行触发一次,当触发的同时,内部的流也被触发,但source流每隔三秒触发后,会取消之前的流。

// RxJS v6+
import { of, interval } from "rxjs";
import { switchMap, take } from "rxjs/operators";

const source$ = interval(3000);
const main = source$
  .pipe(switchMap(() => interval(500).pipe(take(10))))
  .subscribe(item => console.log(item));

concatMap

  • 以序列化的方式等待前一个流执行完毕后执行下一个流。
// RxJS v6+
import { of, interval } from "rxjs";
import { concatMap, mergeMap, take, delay } from "rxjs/operators";

const source$ = of(2000, 1000, 3000);
const concatMapExample = source$
  .pipe(concatMap(val => of(`Delayed by:${val}ms`).pipe(delay(val))))
  .subscribe(item => console.log(`With ConcatMap: ${item}`));

const mergeMapExample = source$
  .pipe(
    delay(8000),
    mergeMap(val => of(`Delayed by:${val}ms`).pipe(delay(val)))
  )
  .subscribe(item => console.log(`With MergeMap: ${item}`));

RxJS API List

mergeMap

switchMap

concatMap