Angular 6 HttpInterceptor 正确行为

标签 angular angular6 angular-http-interceptors

我在 Angular 6 中编写了一个 Http 拦截器 目标是在返回 302 status 时重新加载主页。 我目前无法理解为什么 HttpInterceptor 的行为方式如此

代码:

返回302状态的API调用如下。 this._service.checkStatus() 调用后端 API,返回 302 http 状态

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 内执行错误处理程序代码?

最佳答案

使用 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);     
     })
  )

关于Angular 6 HttpInterceptor 正确行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54147144/

相关文章:

angular - HttpInterceptor 中的注入(inject)服务未初始化

Angular 2 用户界面路由器 : change data in parent state

angular - 将 flex 规则应用于多个 Angular 4 组件的通用解决方案

javascript - 单击并拖动每条绘图线可创建多条垂直绘图线。使用 Angular 6 和 Highcharts 开发

angular - 在 mat-table parent 中使用 ngif 时,mat-filtering/mat-sort 无法正常工作

angular - 如何使用http拦截器拦截angular-file-upload模块文件上传请求

angular - 如何在调用我的 api 之前减慢/​​等待?

angular - 使用 Angular stackblitz 找不到模块 'rxjs' 或其相应的类型声明。(2307)

angular - 将组件从一个延迟加载的模块导入另一个延迟加载的模块

Angular 6 嵌套模板 View