我应该在服务内部使用HTTP调用,并且在该服务中,我合并了另一个服务以进行错误通知。
由于某种原因,如果我在catchError管道内进行服务通知调用,则可以正常运行,,但是,如果我在错误处理程序函数内进行服务通知调用,则不起作用,不仅如此,错误处理程序中的其余代码被中断。
示例:
// error message handler
// can not be used inside handleError()
private errorMessageGrowl() {
this.messageService.add({
severity: 'error',
summary: 'Service Error',
detail: 'An error has occurred'
});
}
// error handler
private handleError(error: HttpErrorResponse) {
// this works fine
console.log('FLAG 1');
// THIS DOES NOT WORK
this.errorMessageGrowl();
// THIS IS NEVER CALLED
console.log('FLAG 2');
// return an ErrorObservable with a user-facing error message
return new ErrorObservable(
'Something bad happened; please try again later.');
}
// http request
getService(): Observable<any> {
return this.http.get<any>('./../../assets/data/example.json')
.pipe(
retry(4),
catchError(this.handleError)
);
}
它重试4次,在控制台中只显示一次“ FLAG 1”日志,但是从不显示errorMessageGrowl()和“ FLAG 2”日志。
现在,如果我从错误处理程序中删除通知服务,并在catchError管道内调用它,则它可以正常运行:
// error handler
private handleError(error: HttpErrorResponse) {
// this works fine
console.log('FLAG');
// return an ErrorObservable with a user-facing error message
return new ErrorObservable(
'Something bad happened; please try again later.');
}
// http request
getService(): Observable<any> {
return this.http.get<any>('./../../assets/data/example.json')
.pipe(
retry(4),
catchError((error) => {
this.handleError(error);
// it works outside handleError()
this.errorMessageGrowl()
})
);
}
答案 0 :(得分:2)
通过写作
catchError(this.handleError)
您失去了上下文(this
并不指向您期望的事物)
用
替换catchError((...args) => this.handleError(...args))
// OR
catchError(this.handleError.bind(this))
答案 1 :(得分:1)
这可能是因为您失去了this
的上下文。使用bind()保留
// http request
getService(): Observable<any> {
return this.http.get<any>('./../../assets/data/example.json')
.pipe(
retry(4),
catchError(this.handleError.bind(this))
);
}
答案 2 :(得分:1)
您正在丢失catch中的上下文。您需要调用绑定或使用粗箭头函数来调用handleError()
catchError(this.handleError.bind(this)
// or
catchError((err) => this.handleError(err))