我正在开发一个使用 ngrx/store 1.5 和 thunk 中间件的应用程序,我正在尝试迁移到 ngrx/store 2.0 和 ngrx/effects。关于如何处理多个相关动作和/或效果,我有几个问题。
我意识到 thunk 与效果的“心态”是不同的,我正在努力解决这些差异。我查看了可用的示例应用程序,但没有发现任何似乎适合我正在尝试的东西,所以也许我仍然完全错误地接近它。
方案 1
这是处理向服务器发出登录请求的副作用:
@Effect login$: any = this.updates$
.whenAction(LoginActions.LOGIN)
.map(toPayload)
.switchMap(payload =>
this.loginService.login(payload.user, payload.password)
.map(result => this.actions.loginSuccess(value))
.catch((error) => Observable.of(this.loginError(error)))
));
鉴于最初的副作用,成功登录后触发导航到“主”屏幕的“正确”或“建议”方式是什么?这也可以概括为简单地触发一系列动作或操作。
我考虑过的几个选项:
(a) 登录成功触发的另一个效果,触发后续动作来触发导航?
@Effect navigateHome$: any = this.updates$
.whenAction(LoginActions.LOGIN_SUCCEEDED)
.mapTo(this.actions.navigateHome());
(b) 登录成功触发的另一种效果,即简单地执行导航操作?
@Effect navigateHome$: any = this.updates$
.whenAction(LoginActions.LOGIN_SUCCEEDED)
.do(this.navigateHome())
.filter(() => false);
(c) 将附加动作连接到初始登录效果发出的动作?(样本显然不太正确,但给出了这个想法)
@Effect login$: any = this.updates$
.whenAction(LoginActions.LOGIN)
.map(toPayload)
.switchMap(password => Observable.concat(
this.loginService.login(passcode)
.map(result => this.actions.loginSuccess(value))
.catch((error) => Observable.of(this.loginError(error))),
Observable.of(this.actions.navigateHome())
));
(d) 其他?
方案 2
考虑一个需要按顺序发出多个请求的情况,当每个请求开始时,我们希望更新“状态”以便可以向用户提供反馈。
类似这些方面的事情的例子:
multiphaseAction() {
return (dispatch) => {
dispatch(this.actions.updateStatus('Executing phase 1');
this.request1()
.flatMap(result => {
dispatch(this.actions.updateStatus('Executing phase 2');
return this.request2();
})
.flatMap(result => {
dispatch(this.actions.updateStatus('Executing phase 3');
return this.request3();
})
...
}
}
同样,在使用效果方法时,“正确”或“建议”的方法是什么?
这个我更坚持,除了.do(this.store.dispatch(this.actions.updateStatus(...))
以某种方式添加一些之外,我不确定还能做什么......