NgRx中expirationTimerElapsed未触发terminateSession动作问题求助
问题:NgRx Effect未触发预期动作
在app.component.ts中设置了会话超时定时器,超时后分发SessionActions.expirationTimerElapsed()动作:
timerExpiration: setTimeout(() => { this.store.dispatch(SessionActions.expirationTimerElapsed()) }, 2000) as unknown as number,
按照预期,该动作触发后,session.effects.ts中对应的Effect应该分发SessionActions.terminateSession动作,但实际并未执行。Effect代码如下:
expiredTimer = createEffect(()=> this.actions.pipe( ofType(SessionActions.expirationTimerElapsed), map(()=> SessionActions.terminateSession({reason :'TimeOut'})) ) );
排查要点:
- 确认
SessionEffects类已在模块中通过EffectsModule.forRoot()或EffectsModule.forFeature()注册,未注册的话Effect不会生效。 - 检查动作定义:确保
ofType传入的是SessionActions.expirationTimerElapsed的类型对象(用createAction生成的动作会自动附带类型对象),如果是手动定义的动作,要传入对应的type字符串。 - 验证定时器是否正常工作:确认组件初始化后
timerExpiration对应的定时器没有被提前清除,且expirationTimerElapsed动作确实被分发(可以用Redux DevTools查看动作日志)。 - 检查Effect流是否中断:在Effect的pipe中添加
catchError捕获异常,或者查看NgRx DevTools中的错误信息,避免因未处理的错误导致流终止。 - 确认动作创建函数的正确性:检查
SessionActions.expirationTimerElapsed和SessionActions.terminateSession的定义,确保没有语法错误或参数不匹配的问题。
内容的提问来源于stack exchange,提问作者theRoot
相关产品推荐
相关产品推荐

