<code>public onLogin(docDepId: number | null): void {
this.isProgress = true;
this.userService
.login(this.passwd, docDepId)
.pipe(
finalize(() => (this.isProgress = false)),
catchError(err => {
if (err instanceof ErrorEvent) {
this.alert.error(
<p>Ошибка - сервис не доступен, попробуйте повторить попытку позднее</p>
);
} else {
const error = err.error;
if (error.errorCode === 'ManyUserRoles' && docDepId === null) {
this.roleMsg = error.errorMsg;
if (this.returnUrl === 'index') {
this.router.navigate(['role']).then();
} else {
this.router
.navigate(['role'], {
queryParams: { returnUrl: this.returnUrl }
})
.then();
}
return this.userService.getLoginRoles(error.doctorId);
}
}
return throwError(err);
}),
tap(res => {
if (res instanceof Array) {
this.roleList$.next(res);
} else {
this.authStateService.setAuthState(true);
this.authStateService.setAuthDoctor(<IDoctor>res);
}
}),
mergeMap(value => {
return AuthService.isToken(value)
? this.userService.getDoctorInfo()
: of();
}),
takeUntil(this._onDestroy$)
)
.subscribe(
result => {
const doctor = this.authStateService.getAuthDoctor();
const doctorInfo: IDoctor = result;
doctorInfo.token = doctor.token;
doctorInfo.userId = doctor.userId;
this.authStateService.setAuthDoctor(doctorInfo);
this.router.navigate([this.returnUrl]).then();
},
error => {
if (error.error && error.error.errorMsg) {
this.alert.error(<p>${error.error.errorMsg}</p>
);
} else {
this.alert.error(
<p>Не удалось авторизоваться в системе пожалуйста обратитесь к поставщику услуг</p>
);
}
}
);
}</code>
Тут на самом деле вопрос больше к декомпозиции, например, пусть как в вашем примере необходимо выбрать роль, то для этого достаточно вынести ее получение в отдельный Observable, и, например, воспользоваться оператором switchMapTo, если там нет никаких входных параметров. Тогда код будет проще
Так же можно с чем угодно поступать, например, необходимо запустить диалоговое окно, где у пользователя спрашивают его гендер. Точно так же выносится в отдельный Observable, и используя HOO операторы навершивается на основной поток с логикой. И нам посути не особо важно от куда оно пришло: хоть из памяти или бекенда, или пользователь в консоли ввел.