【问题标题】:how do I throw error from interceptor to the caller function如何从拦截器向调用者函数抛出错误
【发布时间】:2019-02-09 16:38:43
【问题描述】:

在 driver.ts 文件中,我进行 http 调用,像这样

this.http.get(GetDrivers + '?service_identifier=' + 'road_logistic' + '&page=' + '1').subscribe((response:any) => {
      console.log("gio");
    }, err =>{
      console.log(err);
    });

我也有所有 http 调用的拦截器。在这里。

 return observablePromise.pipe(mergeMap(user_tokens => {
            let access_token = user_tokens ? user_tokens.access_token : null;
            let clonedReq = this.addToken(request, access_token);

            return next.handle(clonedReq).pipe(
                tap( 
                    evt =>{
                        if (evt instanceof HttpResponse) {
                            console.log("nice");
                            this.loaderService.storeLoaderOff();
                        }
                    },
                    error =>{
                      throwError("my error");
                    }
              )})

所以问题是,我手动调用驱动程序 http 是一个错误。它涉及拦截器中的tap错误处理程序,(我知道,因为console.log出现了),但是 throwError 不起作用。它应该做的是“我的错误”必须被抛出给调用者(driver.ts http调用)。正如您在驱动程序 http 调用中看到的那样,我捕获错误并在控制台记录它们。我该怎么办?

【问题讨论】:

    标签: angular rxjs reactive-programming ngrx


    【解决方案1】:

    尝试更改您的拦截器,使其使用 catchError 并生成您的自定义错误:

    return observablePromise.pipe(mergeMap(user_tokens => {
        let access_token = user_tokens ? user_tokens.access_token : null;
        let clonedReq = this.addToken(request, access_token);
    
        return next.handle(clonedReq).pipe(
            tap( 
                evt =>{
                    if (evt instanceof HttpResponse) {
                        console.log("nice");
                        this.loaderService.storeLoaderOff();
                    }
                }
            ),
           catchError(error =>{          // <--- this part
                  throwError("my error");
           })
        })
    

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      你不应该在 tap 中做错误的事情。 应该看起来更像这样:

      return next.handle(request).pipe(
          tap(() => console.log('tap')),
          catchError((error: HttpErrorResponse) => {
            return throwError('my error');
          }
      );    
      

      【讨论】:

      • 即使我在我的 driver.ts 文件中写了这个,当我控制台日志错误时,它是 httperrorresponse 而不是“我的错误”。
      猜你喜欢
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多