使用rxjs处理与拦截器不兼容的错误

时间:2019-03-13 08:25:12

标签: angular error-handling rxjs

基于已解决的问题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优先。

1 个答案:

答案 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

替代是在路线顶部使用后卫