Angular NgRx如何在Effect内派发action,成功动作未触发问题排查
问题原因及修复方案
1. 核心问题:Effect的dispatch配置错误
你给loadAllCustomersActionEffect设置了{dispatch: false},这个配置的作用是禁止Effect将返回的Action派发到Store。你在代码中通过map生成了LoadCustomerSuccessAction对应的Action对象,但因为dispatch被禁用,这个Action永远不会被触发,自然不会走到success的相关逻辑。
修复方式:将
{dispatch: false}改为{dispatch: true},或者直接删除这个配置(createEffect默认dispatch为true)。
2. 可选优化:Action匹配和生成写法不规范
你当前的写法存在两处可优化的点,避免后续出拼写错误:
ofType参数建议直接传入createAction生成的动作实例,而非字符串枚举值,NgRx会自动匹配对应type,避免手写字符串写错- map中不要手动拼接Action对象,直接调用已定义的
loadCustomerSuccessAction方法生成动作,保证参数和类型正确
修复后的Effect代码如下:
loadAllCustomersActionEffect = createEffect( () => this.actions$.pipe( ofType(loadAllCustomerAction), // 直接传动作实例 mergeMap(() => this.customerService.update() .pipe( map((customers: CustomerDTO[]) => loadCustomerSuccessAction({payload: customers})), // 调用动作方法生成 )), tap(() => console.log(ActionTypes.LoadAllCustomerAction + " - Action Dispatched")) ) // 删除dispatch: false,默认就是true );
3. 额外确认项
如果修改完上述配置后仍然不触发success动作,需要排查:
customerService.update()接口是否正常返回,有没有抛出错误未捕获,如果接口报错会直接中断流,不会走到map逻辑- 检查Effect类是否已经在当前模块的
EffectsModule.forFeature([你的Effect类])或者根模块的EffectsModule.forRoot([你的Effect类])中注册(从你第一个Effect的打印能正常输出来看,已经注册成功,大概率不需要改)
内容的提问来源于stack exchange,提问作者Tristate
相关产品推荐
相关产品推荐

