Для примера глобального обработчика ошибок, в котором используется HttpInterceptor , необходимо следующее.
- ErrorInterceptor
- ErrorService
- CustomErrorModal
Поток:
app.module
=> регистрация перехватчика.
app.module
=> служба регистрации ошибок в качестве поставщика.
app.component
=> зарегистрировать глобальную обработку ошибок, которая показывает модальную ошибку.
YourCustomComponent
=> не подписываться на ошибку субъекта / наблюдаемого
Ваш главный app.component будет подпишитесь на любые обновления от службы ошибок и отобразите их соответствующим образом, используя модальную ссылку.
app.module
//other code
const interceptors = [{
provide: HTTP_INTERCEPTORS,
useClass: ErrorInterceptor,
multi: true
}];
const services = [{
ErrorService
}];
@NgModule({
//other code
providers: [
interceptors,
services
],
//other code
})
error.service
@Injectable()
export class ErrorService
{
private errors = new Subject<string[]>();
constructor() { }
public addErrors = (errors: string[]): void =>
this.errors.next(errors);
public getErrors = () =>
this.errors.asObservable();
}
error.interceptor
@Injectable()
export class ErrorInterceptor implements HttpInterceptor
{
constructor(private errorService: ErrorService)
{
}
intercept(
request: HttpRequest<any>,
next: HttpHandler): Observable<HttpEvent<any>>
{
return next.handle(request).do(() => { }, (response) =>
{
if (response instanceof HttpErrorResponse)
{
if (response.status === 401)
{
return;
}
if (response.status === 400 &&
response.error)
{
this.errorService.addErrors(Array.isArray(response.error) ? response.error : [response.error]);
return;
}
this.errorService.addErrors([`Your generic error message`]);
}
return Observable.throw(response);
});
}
}
app.component
export class AppComponent implements OnDestroy
{
private ngUnsubscribe = new Subject();
@ViewChild('modalError')
displayErrorRef: ModalComponent;
constructor(private errorService: ErrorService)
{
this.initializeErrors();
}
ngOnDestroy()
{
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
private initializeErrors()
{
this
.errorService
.getErrors()
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe((errors) =>
{
//this.displayErrorRef.error = errors
this.displayErrorRef.show();
});
}
}
ngUnsubscribe
предназначен для автоматического удаления подписки при уничтожении вашего основного app.component
.