Angular和RxJS-catchError()不会捕获请求错误

时间:2020-05-21 20:42:46

标签: angular typescript rxjs

更新:我发现了问题。答案在下方

我的服务类别中包含以下代码:

public getListById(id:string): Observable<any[]> {
        return this.http.get<any[]>(`${BASE_URL.local}/${id}`).pipe(
            map(obj => obj),
            catchError(error => this.handleError(error))
        )
    }

handleError(error: any): Observable<any> {
        console.log(error)
        this.snackBar.open(
            "Server Error",
            "X"
        )
        return EMPTY;
    }

以及我组件中的以下代码:

this.myService.getListById(id).subscribe(
    res => { doSomethingWith(res) },
    error => { 
        this.noRows = true
        console.log(error)
    },
    () => { this.loading = false }
)

当服务在休息地址中调用GET时,显示500错误,我想处理。

但是出于某种原因,catchError()中的pipe()函数无法捕获错误,只能在() => { this.loading = false }内部运行subscribe()代码。

这个糟糕的RxJs模块在做错什么(严重的是,我不喜欢它与后端请求一起工作的方式),我不能简单地处理请求错误?

谢谢。

答案

我发现了问题。另一位先前的开发人员定义了一个错误拦截器,该功能无法正常工作。

我删除了ErrorInterceptor并定义了一个新的。我还修复了app.module.ts中的'providers'属性定义,因为它没有正确地引用正确的ErrorInterceptor类。

2 个答案:

答案 0 :(得分:0)

这完全是catchError已捕获错误的信号。

handleError返回EMPTY,这意味着关闭流而不发射。而且由于流已关闭,您将看到this.loading = false

debugger之前放入console.log(error)并打开开发人员工具来检查变量,也许this.snackBar.open会出现问题。

答案 1 :(得分:0)

我知道这是不同的,但是尝试更改这种行为:

return this.http.get<any[]>(`${BASE_URL.local}/${id}`).pipe(
  catchError(err => {
    this.errorObject = err;
    return throwError(err);
  })
);

public errorObject = null;

默认情况下,将错误设置为null:this.errorObject = null;