У меня есть приложение Angular, и основной вид разделен на 2 компонента.Это будет касаться обработки действий NgRx в асинхронном режиме.
1) MenuComponent
- содержит различные кнопки навигации, такие как кнопка выхода из системы.После нажатия кнопки выхода из системы вызывается authenticationService.logout()
, который отправляет http-запрос бэкэнду с последующим выходом пользователя из системы.Следовательно, это асинхронная операция.
public logout() {
this.authenticationService.logout();
this.router.navigate(['login']);
}
2) DashboardComponent
- я написал следующее для обработки ловушки жизненного цикла OnDestroy
, которая будет вызываться всякий раз, когда компонент уничтожается.Он использует NgRx для управления состоянием.
ngOnDestroy() {
this.store.dispatch(new UpdateDashboardConfiguration());
this.store.dispatch(new ClearDashboardState());
}
Отправка действия UpdateDashboardConfiguration()
приведет к тому, что приложение отправит http-запрос на сервер для сохранения конфигураций панели мониторинга, поэтому он также является асинхронным.
Основной вопрос заключается в том, что когда пользователь решает выйти из системы, нажав кнопку выхода из системы на MenuComponent
, существует ли способ гарантировать, что отправка UpdateDashboardConfiguration()
будет завершена до отправки * 1018?* Вызываются действия, а также authenticationService.logout()
из другого компонента MenuComponent?
Предпочтительный поток будет следующим:
UpdateDashboardConfiguration
=> ClearDashboardState
=> logout()
Для тех, кому интересно, this.store.dispatch(new UpdateDashboardConfiguration()).subscribe(...)
не будет работать как store.dispatch () типа void, а не как наблюдаемый.
Заранее спасибо.
Для тех, кто заинтересован, это Effect
для действия UpdateDashboardConfiguration.
@Effect()
UpdateDashboardConfiguration$ = this.actions$.pipe(
ofType<UpdateDashboardConfiguration>.(DashboardActionTypes.UpdateDashboardWidget),
withLatestFrom(this.store.select(selectDashboardLayoutStateConfig)),
switchMap(action => {
return this.dashboardService.updateDashboardConfiguration(action).pipe(
map(data => (new UpdateDashboardConfigurationSuccess(data))),
);
}
),
);