为什么Effect中使用withLatestFrom取selector返回action observer对象?
NgRx Effect中withLatestFrom获取Selector值异常问题解决
问题根因
withLatestFrom操作符的入参要求为直接传入Observable实例,不支持直接传入返回Observable的工厂函数。你当前的写法将基于Action参数生成selector Observable的箭头函数直接传给withLatestFrom,导致操作符没有订阅这个Observable,反而将Observable实例本身作为值向下游发射,你拿到的包含actionsObserver、reducerManager等属性的对象,本质就是NgRx Store返回的未订阅Observable实例。- 代码存在括号缺失问题,
withLatestFrom调用未闭合,导致后续mergeMap被误判为withLatestFrom的参数,逻辑完全错位。
修复方案
如果需要根据上游Action的参数动态生成selector对应的Observable,需要先通过高阶映射操作符(如switchMap/concatMap)包裹,再搭配withLatestFrom使用,修正后代码如下:
constructor( private serviceStore: Store<DataState>, ) { searchForLatest$ = createEffect(() => this._actions.pipe( ofType<GetLatestRequestService>(GetLatestData), // 接收action后动态构造selector Observable switchMap(action => of(action).pipe( withLatestFrom(this.serviceStore.select(getlatestData(action.id))) ) ), // 下游拿到的是[action, 业务数据]的元组 mergeMap(([action, latestData]) => { // 此处latestData即为selector返回的正常业务数据 // 后续业务逻辑 }) ) ) }
可选优化
如果你需要每次Action触发时主动拉取一次selector的当前值,也可以改用take(1)直接订阅selector,写法更简洁:
switchMap(action => this.serviceStore.select(getlatestData(action.id)).pipe( take(1), map(latestData => [action, latestData] as const) ) )
内容的提问来源于stack exchange,提问作者Tabares
相关产品推荐
相关产品推荐

