RxJS如何仅在redraw$触发时获取BehaviorSubject visible$的最新数据
问题根因
你最初的写法之所以会在this.visible$更新时触发回调,是因为mergeMap会订阅你返回的this.visible$流,而BehaviorSubject属于热流,只要它产生新值,所有活跃订阅都会收到通知,自然就会触发下游回调。
你想到的嵌套订阅写法存在明显缺陷:每次this.redraw$触发都会新建一个this.visible$的订阅,如果没有手动做取消订阅的逻辑,这些订阅会一直留存,造成内存泄漏,属于RxJS中不推荐的写法。
规范实现方案
方案1:使用withLatestFrom(最适配该场景)
该操作符的特性是仅当主源流(也就是你的this.redraw$)触发时,才提取其他关联流的最新值组合后传给下游,关联流自身的更新不会触发下游回调,完全匹配你的需求,写法最简洁:
this.redraw$.pipe( withLatestFrom(this.visible$) ).subscribe(([_, userfavourite]: [unknown, UserFavourite[]]) => { // 执行你的业务逻辑 })
方案2:在mergeMap中补充take(1)
如果你要沿用原有的mergeMap写法,只需要在内部返回的流中加take(1),表示每次只取this.visible$的当前一次值就结束内部订阅,不会继续监听后续的this.visible$更新:
this.redraw$.pipe( mergeMap(() => this.visible$.pipe(take(1))) ).subscribe((userfavourite: UserFavourite[]) => { // 执行你的业务逻辑 })
两种方案都只需要维护最终subscribe返回的单个订阅对象,在生命周期结束(例如组件销毁)时统一取消订阅即可,不会产生内存泄漏问题。
内容的提问来源于stack exchange,提问作者user16382159
相关产品推荐
相关产品推荐

