【发布时间】:2019-08-03 20:35:10
【问题描述】:
基于这个已解决的问题Angular intercepting http errors,我面临着一个巨大的哲学问题。
我所有的服务都是这样的:
public getSomething(): Observable<Something> {
return this.http
.get<Something>(url)
.pipe(
map(res => res.data),
catchError((e): Observable<any> => of(e))
);
}
如果我的身份验证令牌无效/过期,服务会捕获错误。 我可以在那儿直接注销。
但是,如果我有很多服务,我必须多次重复这个过程。因此我需要配置一个拦截器或自定义错误处理程序。
如果我在服务中保留 catchError,两者都不会触发。
如果我选择保持 DRY,我需要删除 catchError。如果我删除 catchError,rxjs 将变得几乎无用(完成、重试......等)
如果我选择保留 catchError,我需要修改所有这些以调用某种全局错误处理函数以保持一定程度的 DRY。但是我并没有像我应该使用的那样使用 Angular。
我该如何处理这种情况?
编辑:https://stackblitz.com/edit/angular-m2jc9n
ErrorHandler 处于活动状态,Interceptor 在 app.module 中进行了注释。 如果从服务中移除 catchError,则触发 ErrorHandler,否则 catchError 优先。
【问题讨论】:
-
catchError并没有真正捕获错误,它只是在发生错误时保持流继续,将错误交换为返回值。而且由于流不会停止并且您使用HttpClient,我不明白为什么您的拦截器不会触发。考虑留下您的问题的minimal reproducible example 以显示确切的问题。 -
“如果我在服务中保留 catchError,两者都不会触发” - 你能解释一下吗?
-
@trichetriche 你在这里有一个堆栈闪电战angular-m2jc9n.stackblitz.io
-
@gyc 能否提供 stackblitz 的链接而不是它的演示?
-
@tricheriche 哦对不起:stackblitz.com/edit/angular-m2jc9n
标签: angular error-handling rxjs