前端阅读 05月30日 21:21
RxJS 中 switchMap、mergeMap、concatMap 该怎么选?
switchMap、mergeMap、concatMap 都是把外层值映射成内部 Observable,再把结果摊平,但它们处理“新任务来了,旧任务怎么办”的策略不同。switchMap 会取消旧任务,只要最新结果;mergeMap 会并发执行,所有结果都要;concatMap 会排队,一个完成后再做下一个。追问为什么搜索框通常用 switchMap?用户连续输入时,旧关键词请求已经没有展示价值。switchMap 会退订上一次内部流,避免慢请求晚返回覆盖新结果。mergeMap 有什么风险?mergeMap 默认不限制并发,外层值很多时会同时打出大量请求。实际项目常用第二个参数限制并发数。concatMap 为什么慢但常用?它故意排队,前一个内部 Observable 不 complete,后一个不会开始。适合顺序保存、支付步骤、分片上传。和 exhaustMap 怎么区分?exhaustMap 忙的时候忽略新任务,适合防重复提交。switchMap 抛弃旧的保留新的,exhaustMap 保留旧的忽略新的。写段代码searchText$.pipe( debounceTime(300), distinctUntilChanged(), switchMap(q => apiSearch(q).pipe(catchError(() => of([]))))).subscribe(renderList);