基于已解决的问题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处于活动状态,拦截器在app.module中被注释。 如果从服务中删除catchError,则会触发ErrorHandler,否则catchError优先。
答案 0 :(得分:1)
如果您要使用共享的拦截器,则可以将HTTP_INTERCEPTOR放在斜角:
在您的class Test {
testVar = 1;
constructor(x, y) {
this.counter = 0;
this.x = x;
this.y = y;
this.increaseCounter();
this.testVar += 1;
}
getCounter() {
console.log("Counter:", this.counter);
}
increaseCounter() {
this.counter += 1;
}
}
module.ts
服务@NgModule({
declarations: [
...
],
imports: [
...
],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: LoginInterceptor,
multi: true
}
]
})
:
LoginInterceptor
替代是在路线顶部使用后卫。