You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:27:02