Angular HttpInterceptor错误处理替换流不返回结果?

时间:2019-01-22 12:14:42

标签: angular

我有一个拦截器,可以处理错误,但是我想用undefined替换404错误,以确保我的订阅仍然激活。这将使我能够使用可观察的组合运算符,其中可以预期流404并具有含义。这是我的拦截器:

@Injectable() 导出类WebApiHttpInterceptor实现HttpInterceptor {

constructor(private router: Router,
    private authService: AuthService) { }

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    // send the newly created request //.timeout(10000)
    return next.handle(authReq)
        .pipe(
            catchError(error => {
                // dont navigate if 404. 404 could be a valid api response for some things like getting the user picture.
                if (error.status && error.status === 404) {
                    return of(undefined);
                }
                else {
                    this.router.navigate(['/error']);
                    return throwError(error);
                }
            })
        );
}

}

我们可以在这里看到,如果它是404,我们只是返回一个可观察到的undefined。

以下是一些发出http请求的代码:

forkJoin(
      this.api.getSomeStuff(), // this returns data
      this.api.GetUser(), // this returns data
      this.api.GetPicture() // this could be 404 which is valid
)
.subscribe(res => {
    console.log("sub")
  },
  () => console.log("err"),
  () => console.log("com"));

输出:

// com

我不知道如何强制catchError替换流中的项目。 catchError可以采用2个参数,一个是错误,一个是捕获的可观察值。如果我改为返回捕获到的可观察对象,则似乎陷入了http调用的无限循环。

编辑:

将拦截器手柄管道更改为此:

return next.handle(authReq)
    .pipe(
        catchError((error, caught) => {
            // dont navigate if 404. 404 could be a valid api response for some things like getting the user picture.
            if (!error.status || error.status === 404) {
                this.router.navigate(['/error']);
            }

            return throwError(error);
        })
    );

以及与此的forkjoin:

forkJoin(
  this.api.GetBusinessTypes(),
  this.api.GetUser(),
  this.api.GetPicture().pipe(catchError(err => of(undefined)))
)

已经工作了,但是现在每当我进行forkjoin时,我都需要重复此管道。

0 个答案:

没有答案