更新:我发现了问题。答案在下方
我的服务类别中包含以下代码:
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类。
答案 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;