如何在reportMode$流过滤触发时获取selectedObjectsIds$可观测流的数据
实现方案
你要的是reportMode$匹配ReportMode.close状态时,才获取selectedObjectsIds$的最新值,最适配的方案是使用withLatestFrom操作符,比你已知的combineLatest更贴合触发逻辑:
方案1:withLatestFrom(推荐,RxJS 7+通用)
该操作符仅在主源流(过滤后的reportMode$)emit值时,才获取目标流的最新值,不会因为selectedObjectsIds$更新触发多余回调。
import { filter, withLatestFrom } from 'rxjs/operators'; this.reportMode$.pipe( filter((state: ReportMode) => state === ReportMode.close), // 主源流触发时取selectedObjectsIds$的最新值 withLatestFrom(this.selectedObjectsIds$) ) .subscribe(([_, selectedIds]) => { // 此处selectedIds就是你需要的selectedObjectsIds$数据 // 写你的业务逻辑即可 });
如果你的selectedObjectsIds$可能从未emit过值(比如冷流、异步请求还没返回),可以加startWith给默认值避免回调不触发:
import { filter, withLatestFrom, startWith } from 'rxjs/operators'; this.reportMode$.pipe( filter((state: ReportMode) => state === ReportMode.close), withLatestFrom(this.selectedObjectsIds$.pipe(startWith([]))) // 给个空数组默认值,根据你的业务调整 ) .subscribe(([_, selectedIds]) => { // 业务逻辑 });
方案2:switchMap(适用需要动态取值的场景)
如果每次reportMode切换为close时,需要重新拉取最新的选中ID(比如selectedObjectsIds$是异步请求流),可以用switchMap:
import { filter, switchMap } from 'rxjs/operators'; this.reportMode$.pipe( filter((state: ReportMode) => state === ReportMode.close), switchMap(() => this.selectedObjectsIds$) ) .subscribe(selectedIds => { // 业务逻辑 });
关于combineLatest的问题
你已知的combineLatest方案会存在多余触发的问题:只要selectedObjectsIds$更新,不管reportMode是不是close状态,只要两个流都有过emit记录,就会触发回调,你需要额外加一层filter过滤状态,性能和可读性都不如上面两个方案。
内容的提问来源于stack exchange,提问作者user15423370
相关产品推荐
相关产品推荐

