Я работаю над приложением, использующим ngrx/store 1.5 вместе с промежуточным программным обеспечением thunk, и я пытаюсь перейти к 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(...))
как-то...