this.handleError 不是函数

k11*_*1k2 3 observable rxjs angular

试图找出为什么handleError无法启动。

我们的 get api 调用结构

get(relativeUrl: string, _httpOptions?: any) {

    var response = this.http.get(baseUrl + relativeUrl, _httpOptions)
          .pipe(
          catchError(this.HandleRequiredErrorResponse)
        ).toPromise();

            var responsedata = new ResponseData;

            responsedata.statusCode = '200';
            responsedata.response = response;

            return responsedata;
}
Run Code Online (Sandbox Code Playgroud)

如果我们通过调用handleError函数记录它而不是我们需要的错误,则此函数会处理我们的自定义错误

HandleRequiredErrorResponse(errorReponse: HttpErrorResponse) {
    var response = new ResponseData;

    if (errorReponse.status == 400) {
      response.statusCode = errorReponse.status.toString();
      response.response = errorReponse.error;
    }
    else if (errorReponse.status == 404) {
      response.statusCode = errorReponse.status.toString();
      response.response = errorReponse.error;
    }
    else {
      console.log(errorReponse)
      let err = this.handleError(errorReponse);//handleError is undefined

      return err;
    }

    return new ErrorObservable(response);
  }
Run Code Online (Sandbox Code Playgroud)

在这里,我们记录了一些相关的消息

handleError(error: HttpErrorResponse) {
    if (error.error instanceof ErrorEvent) {
      console.error('An error occurred:', error.error.message);
    } else {
      console.error(
        `Backend returned code ${error.status}, ` +
        `body was: ${error.error}`);
    }
    return new ErrorObservable(
      'Something bad happened; please try again later.');
  }
Run Code Online (Sandbox Code Playgroud)

我的进口是

import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { ErrorObservable } from 'rxjs/observable/ErrorObservable';
import { catchError } from 'rxjs/operators';
Run Code Online (Sandbox Code Playgroud)

joh*_*667 5

它与函数作用域和闭包有关。Observable 操作符在幕后创建了许多新的 Observable,并且使用构造函数创建一个新对象也会创建一个新的this上下文。该catchError参数不知道this直接传入时指的是您的组件。

只需将它包装在一个 lambda 函数中:

catchError(err => this.HandleRequiredErrorResponse(err))

Lambda/fat 箭头方法具有词法this值,因此this将始终引用调用箭头方法的对象。这减轻了历史上与 JS 开发相关的大量头痛。