代码之家  ›  专栏  ›  技术社区  ›  gyc

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

  •  0
  • gyc  · 技术社区  · 7 年前

    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,则不会触发两者。

    如果我选择保持干燥,我需要删除catchError。如果我删除catchError,rxjs实际上就没用了(finalize、retry…等等)

    如果我选择保留catchError,我需要修改所有这些函数,以调用某种全局错误处理函数,使其保持干爽。但我并没有像我应该的那样使用角度。

    我该如何处理这种情况?

    https://stackblitz.com/edit/angular-m2jc9n

    ErrorHandler处于活动状态,拦截器在app.module中被注释。 如果从服务中删除catchError,则会触发ErrorHandler,否则catchError优先。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Wandrille    7 年前

    如果你想有一个共享的拦截器,你有角度 HTTP_INTERCEPTOR :

    module.ts

    @NgModule({
      declarations: [
       ...
      ],
      imports: [
       ...
      ],
      providers: [
        {
          provide: HTTP_INTERCEPTORS,
          useClass: LoginInterceptor,
          multi: true
        }
      ]
    })
    

    以及服务 LoginInterceptor

    @Injectable()
    export class LoginInterceptor implements HttpInterceptor {
    
      constructor() {
      }
    
      intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    
        return next.handle(request).pipe(
          tap(() => {
            }, (err: any) => {
              if (err instanceof HttpErrorResponse) {
                // DO here what you want
                // this.router.navigate(['login']);
              }
            }
          )
        );
      }
    }
    

    另一种选择 警卫 在你的路线顶端。

    推荐文章