Angular 6 HttpInterceptor正确行为

时间:2019-01-11 13:05:52

标签: angular angular6 angular-http-interceptors

我在Http Interceptor中写了Angular 6 . 目的是在返回302 status时重新加载主页。 我目前无法理解HttpInterceptor的行为方式

代码:

下面是返回302 status

API调用。 this._service.checkStatus()调用返回302 http status

的后端API

API代码:

public checkStatus() : void  {


      this._service.checkStatus().subscribe(

        (data) => console.log('success In checkStatus '),
        (error)=>console.log('error In checkStatus')
      );

 }

拦截器代码:

export class MyInterceptor implements HttpInterceptor{


    constructor(){

    }

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

        console.log('inside interceptor' );
        return next.handle(request).pipe(

        tap(
                event =>{
                },
                error=>{
                    console.log(error);

                    if (error instanceof HttpErrorResponse) {
                        if (error.status === 302) {
                            window.location.reload();                      
                        }
                      }
                }
            )
       );

    }

}

问题:

现在的问题是,当返回302 status时,行(error)=>console.log('error In checkStatus')仍在API中执行-checkStatus调用。

我的问题是,为什么API调用中的错误处理程序仍然被调用。 也就是说,在返回302之后,页面会重新加载window.location.reload()

但是错误处理程序(error)=>console.log('error In checkStatus')仍被调用。

需要采取什么措施来防止在checkStatus API内执行错误处理程序代码?

1 个答案:

答案 0 :(得分:2)

尝试使用catchError。

return next.handle(request).pipe(   

     tap((event: HttpEvent<any>) => {
       console.log('tap', event);
     }),

     catchError(error => {

       console.log('catchError', error);

       if (error instanceof HttpErrorResponse) {
         if (error.status === 302) {
           window.location.reload();                      
         }
       }

       return throwError(error);     
     })
  )