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
相关产品推荐
相关产品推荐

