获得订阅数据后,我想在下面派遣操作。但是,订阅和调度都异步执行,没有链条被迫下注。订阅和派遣。也无法描述在订阅中的派遣,因此会导致无限循环。
当我从订阅中获取某些数据时,要派遣操作的更好方法是什么?
我当前的代码是
// MyApp.ts
ngOnInit() {
this.store.subscribe(appState => {
this.userId = ppState.currentUserId;
)};
this.store.dispatch(new LoadInitialData(this.userId);
data$ = this.store.select('data');
}
我可能的解决方案只是在@effect((...
中实现// MyApp.ts
ngOnInit() {
this.store.dispatch(new LoadUserId());
}
//MyEffectService.ts
@Effect() loadUserId$ = this.actions$
.ofType(LOAD_USER_ID)
.withLatestFrom(this.store.select('userId')
.map([any, userId] => userId)
.map(userId => new LoadInitialData(userId));
this.store
.map(appState => ppState.currentUserId)
.do(userId => this.store.dispatch(new LoadInitialData(userId))
.subscribe(userId => this.userId = userId);
使用集合立即使用它应该在循环中进行派遣事件
this.store.subscribe(appState =>
setImmediate(() => {
this.userId = ppState.currentUserId
this.store.dispatch(new LoadInitialData(this.userId)
})
))
您提到的"可能"解决方案看起来不错。
这是一个很好的做法,可以使您的智能组件(或容器(保持简单,而没有太多业务逻辑。
这就是为什么,我建议您将您的操作重命名为"加载"或" initview"," open" ...以更好地匹配真实的动作。(此处的视图初始化或视图打开...(。将来,您可以想象在初始化组件时做更多的事情(不仅仅是加载用户数据...(。您的代码内部组件将保持简单,只有一个动作派遣。业务逻辑保留在您的效果中。
关于这一点,请查看Mike Ryan的这次良好会议:与NGRX
的好动作卫生然后,使用效果来派遣另一个动作(负载需要数据...(听起来很不错。
示例(没有新效果/动作创建者语法(:
// MyApp.ts
ngOnInit() {
this.store.dispatch(new Init());
}
// MyEffectService.ts
@Effect()
init$ = this.actions$
.ofType(Init)
.withLatestFrom(this.store.select(selectors.getUserId)
.map([any, userId] => userId)
.map(userId => new LoadInitialData(userId));
ps:另一种良好的做法也是始终使用selector
检索您的状态。(在上面的示例中,我使用了selectors.getUserId
(