NgRx状态管理中连续调用dispatch的相关疑问
NgRx 新手疑问解答
针对你提出的在store.select订阅回调中dispatch action的相关疑问,逐一解答如下:
1. 是否会导致无限循环?
会触发无限循环,除非你在reducer中添加终止条件。
- 当
state.Status == true时,你dispatch的Action1、Action2会触发reducer修改countriesState状态 - 状态更新后,
store.select订阅会立即收到新状态,再次执行回调函数 - 如果Action1/Action2的reducer没有将
state.Status改为false,回调中的条件判断会持续成立,反复触发dispatch,形成无限循环
2. 导航语句能否被执行?
第一次进入回调时,导航语句会被执行,但如果触发无限循环,后续的导航逻辑会被打乱(比如重复触发导航、循环阻塞线程)。
如果在Action1/Action2的reducer中将state.Status设为false,循环只会触发一次,导航能正常完成。
3. dispatch 是否为同步函数?
是的,NgRx的store.dispatch()是同步执行的。调用后会立即触发reducer计算新状态,状态更新完成后,所有订阅该状态的观察者会同步收到新状态通知。
你的代码优化建议
(1)补充订阅清理逻辑
目前代码未在组件销毁时取消订阅,会导致内存泄漏,需在ngOnDestroy中添加:
ngOnDestroy() { this.storeSubscriptions.forEach(sub => sub.unsubscribe()); }
(2)添加循环终止条件
在Action1或Action2的reducer分支中修改Status为false,打破循环:
export function countriesReducer(state: countries, action: Action): countries { switch (action.type) { case 'Action1': return { ...state, // 你的其他状态修改逻辑 Status: false // 新增这行终止循环 }; case 'Action2': return { ...state, // 你的其他状态修改逻辑 }; default: return state; } }
(3)修正路由导航方法拼写
代码中this.router.navigation是拼写错误,正确写法为this.router.navigate:
this.router.navigate(['/confirm-region'], { relativeTo: this.route.parent })
内容的提问来源于stack exchange,提问作者VA1267
相关产品推荐
相关产品推荐

