Angular 拦截器中的错误完成请求
Complete request on error in Angular Interceptor
问题是发生错误时,完整的回调无法隐藏加载指示器。 而且我不想在每个请求中都使用 finalize 运算符。它应该在错误拦截器中完成。
error.interceptor.ts
return next.handle(req).pipe(
timeout(timeOut),
catchError((error: HttpEvent<any>) => {
if (error instanceof HttpErrorResponse) {
if (error.status !== 401) {
const errorMessage = typeof error.error === 'string' ? error.error : 'Unhandled Error! please try again'
this.toast.danger('', errorMessage);
}
if (error.status === 440) this.userService.logout(true);
}
return throwError(error);
})
);
sample.component.ts
this.proxy.CreateVersion(model).pipe(takeUntil(this.unsubscribe$)).subscribe(
result => {
console.log(result)
},
console.error,
() => this.loading.grid = false // Not Working
)
在你的错误中,你捕获并释放
catchError(err => {
/* do some stuff */
return throwError(err);
})
这实际上相当于 tap
的错误。它允许您在发生错误时执行某些操作,而无需更改流的任何内容。
但是,如果您想捕获错误然后成功完成流式传输(现在您已经捕获并处理了错误),通常看起来像这样。
catchError(err => {
/* do some stuff */
return of({defaultValue});
})
catchError(err => {
/* do some stuff */
return EMPTY;
})
这两种方法都将错误的流转换为成功的流,该流将在最终订阅中调用 complete
处理程序而不是 error
处理程序。
问题是发生错误时,完整的回调无法隐藏加载指示器。 而且我不想在每个请求中都使用 finalize 运算符。它应该在错误拦截器中完成。
error.interceptor.ts
return next.handle(req).pipe(
timeout(timeOut),
catchError((error: HttpEvent<any>) => {
if (error instanceof HttpErrorResponse) {
if (error.status !== 401) {
const errorMessage = typeof error.error === 'string' ? error.error : 'Unhandled Error! please try again'
this.toast.danger('', errorMessage);
}
if (error.status === 440) this.userService.logout(true);
}
return throwError(error);
})
);
sample.component.ts
this.proxy.CreateVersion(model).pipe(takeUntil(this.unsubscribe$)).subscribe(
result => {
console.log(result)
},
console.error,
() => this.loading.grid = false // Not Working
)
在你的错误中,你捕获并释放
catchError(err => {
/* do some stuff */
return throwError(err);
})
这实际上相当于 tap
的错误。它允许您在发生错误时执行某些操作,而无需更改流的任何内容。
但是,如果您想捕获错误然后成功完成流式传输(现在您已经捕获并处理了错误),通常看起来像这样。
catchError(err => {
/* do some stuff */
return of({defaultValue});
})
catchError(err => {
/* do some stuff */
return EMPTY;
})
这两种方法都将错误的流转换为成功的流,该流将在最终订阅中调用 complete
处理程序而不是 error
处理程序。