Вы можете передать функцию обратного вызова с ошибкой вместе с успешным обратным вызовом. Обратный вызов ошибки вызывается при сбое запроса GET
:
this.loginService.login(this.user,
() => this.router.navigateByUrl('/'),
//handle the error here, log to an error service etc.
(err) = > console.error(err)
);
На стороне службы в обработчике ошибок Observable
вы вызываете errorCallback
, который вы передали от компонента :
login(credentials, successCallback, errorCallback) {
const headers = new HttpHeaders(credentials ? {
authorization: 'Basic ' + btoa(credentials.email + ':' + credentials.password)
} :
{});
this.http.get(this.API.crudAdmin + 'admin?email=' + credentials.email, {
headers: headers
}).subscribe(response => {
if (response['name']) {
this.authenticated = true;
} else {
this.authenticated = false;
}
successCallback && successCallback();
},
errorCallback);
}
Традиционная попытка перехвата здесь не сработает, поскольку это асинхронная операция, блок перехвата не сможет перехватить ошибку, когда в итоге произойдет сбой GET
.
Это связано с тем, что метод loginService.login
возвращается немедленно, в то время как запрос GET
выполняется асинхронно в фоновом режиме. Любая ошибка из GET
не будет обрабатываться блоком catch
, окружающим вызов loginService.login
.