981377660LMT / ts

ts学习
6 stars 1 forks source link

rxjs 四种Map 的区别 #550

Open 981377660LMT opened 4 months ago

981377660LMT commented 4 months ago
// concatMap、mergeMap、switchMap、exhaustMap
// 区别:
// concatMap:按顺序处理每个 observable,等待一个完成后再处理下一个
// mergeMap:同时处理所有 observable,任何一个 observable 发出值时都会发出值
// switchMap:只处理最新的 observable,之前的 observable 会被取消订阅
// exhaustMap:只处理第一个 observable,直到其完成后才处理下一个 observable
// 使用场景:
// concatMap:处理有顺序要求的任务,如处理队列
// mergeMap:处理并发任务,如请求多个接口
// switchMap:处理最新的任务,如搜索自动完成(用户输入的每次变化只需请求最新的数据,并取消之前的订阅)
// exhaustMap:希望忽略新的源值直到当前 Observable 完成的情况,如防止在长时间运行的任务(如文件上传)完成之前启动新任务。

function testMap() {
  const source$ = of(1, 2, 3)

  // 使用 concatMap
  // 依次:1 2 3
  // source$.pipe(concatMap(val => of(val).pipe(delay(1000)))).subscribe(console.log)

  // 使用 mergeMap
  // 同时:1 2 3
  // source$.pipe(mergeMap(val => of(val).pipe(delay(1000)))).subscribe(console.log)

  // 使用 switchMap
  // 3
  // source$.pipe(switchMap(val => of(val).pipe(delay(1000)))).subscribe(console.log)

  // 使用 exhaustMap
  // 1
  // source$.pipe(exhaustMap(val => of(val).pipe(delay(1000)))).subscribe(console.log)
}