服务调用在Angular 5中的错误处理程序中不起作用

时间:2018-08-29 13:02:08

标签: angular typescript rxjs

我应该在服务内部使用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()
            })
        );
}

3 个答案:

答案 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))