ngrx/store 1.5 とサンク ミドルウェアを使用するアプリケーションで作業しており、ngrx/store 2.0 と ngrx/effects に移行しようとしています。関連する複数のアクションや効果を処理する方法についていくつか質問があります。
サンクとエフェクトの「考え方」が異なることに気づき、その違いを理解しようとしています。私は利用可能なサンプルアプリを調べましたが、私が試みているものに合うと思われるものを見つけられなかったので、おそらく私はまだ完全に間違っています.
シナリオ 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(...))
...