NGRX中Effect跨状态触发Action后对应Reducer未执行问题
可能的原因及排查方向
Action的type值不匹配
这是最高发的问题,需确认两处值完全一致:MapActionTypes.CreatePointOfInterestSuccess枚举定义的字符串值,和CreatePointOfInterestSuccess类的type属性赋值完全相同(大小写、空格、符号都不能有差异)- DevTools中看到的触发的Action的
type字段值,和reducer中case对应的值完全一致。很多时候是开发时改了枚举值但是忘了同步Action类的type赋值,导致匹配失败。
Reducer未正确注册
如果是feature模块的reducer,检查是否正确调用了StoreModule.forFeature('你的feature名', reducer)并导入到对应模块;如果是根reducer,检查是否在StoreModule.forRoot()的reducer映射中正确配置了map对应的reducer。
注意:只要Action被dispatch,DevTools就会显示,和reducer是否注册无关,所以你能在工具里看到Action不代表reducer已经被正确接入store。
- Action携带不可序列化内容
NgRx默认开启动作可序列化校验,如果CreatePointOfInterestSuccess的payload中包含函数、Promise、类实例等不可序列化的值,可能会被拦截,无法传递到reducer。你可以临时关闭校验测试:
StoreModule.forRoot(reducers, { runtimeChecks: { strictActionSerializability: false } })
如果关闭后恢复正常,就需要清理Action payload中的不可序列化内容。
Effect处理过程中静默报错
检查createPointOfInterest$中switchMap内省略的代码逻辑,是否在构造pointOfInterest参数时出现了运行时异常,且异常被上游操作符吞掉没有走到catchError,导致最终没有正确返回Action数组。可以在return数组前加日志打印Action实例,确认两个Action是否被正常构造。其他Effect拦截了Action
检查是否存在其他监听CreatePointOfInterestSuccess的Effect配置了{ dispatch: false },且处理逻辑中没有重新dispatch该Action,导致Action没有继续传递到reducer。
内容的提问来源于stack exchange,提问作者JoeyD
相关产品推荐
相关产品推荐

