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

Angular NgRx Component Store:switchMap先发射旧值的问题及解决

问题原因

你使用switchMap订阅count$时,由于count$基于ReplaySubject实现,订阅操作会立即触发ReplaySubject重放最近的历史值(也就是状态更新前的旧count),之后才会发射本次状态更新产生的新count值,因此出现了先旧后新的输出。

解决方案

方案一:改用withLatestFrom(推荐)

这个操作符会在success$发出符合条件的值时,直接获取count$的当前最新值,不会触发历史值重放,完全贴合你“仅在isSuccess为true时读取对应实体值”的需求:

this.store.success$
  .pipe(
    filter(isSuccess => isSuccess),
    withLatestFrom(this.store.count$),
    map(([_, count]) => count)
  )
  .subscribe(count => console.log(count));

方案二:保留switchMap并跳过历史值

如果你需要持续监听count的后续变化,可以在switchMap内部给count$添加skip(1)操作符,跳过订阅时立即发出的历史值:

this.store.success$
  .pipe(
    filter(isSuccess => isSuccess),
    switchMap(() => this.store.count$.pipe(skip(1)))
  )
  .subscribe(count => console.log(count));

内容的提问来源于stack exchange,提问作者simply good

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:55:10