5

我有一个方法 handleError() 就像文档https://angular.io/docs/ts/latest/guide/server-communication.html#!#error-handling

private handleError(error: any) {
    console.error(error);
    console.log(this.loginService); // <- always undefined
    return Observable.throw(error);
}

我的问题是,尽管this.loginService已正确注入我的班级,但它是未定义的。它已在其他方法中使用,但在handleError中似乎不可用。

http-catch 调用该方法的方式可能是问题所在吗?如果是这样,我该如何解决?处理错误时我需要执行一些逻辑。

这是一个关于我如何将 handleError 方法设置为回调的示例(就像文档一样)

this.http.get(url,
              ApiRequest.ACCEPT_JSON)
              .map(ApiHelper.extractData)
              .catch(this.handleError);
4

3 回答 3

21

由于您直接传递函数,因此您没有this类的上下文。一个非常简单和最佳实践的方法是使用 lambda 或“胖箭头函数”:

this.http.get(url, ApiRequest.ACCEPT_JSON)
    .map(res => ApiHelper.extractData(res))
    .catch(err => this.handleError(err));

关于何时使用 lambdas 的真正好读物:https ://stackoverflow.com/a/23045200/1961059

于 2016-06-23T11:57:21.793 回答
5

thishandleError你的情况下可能不是你认为的那样。

尝试执行以下操作:

this.http.get(url,
              ApiRequest.ACCEPT_JSON)
              .map(ApiHelper.extractData) 
              .catch(this.handleError.bind(this)); // <-- add .bind(this)
于 2016-06-23T11:54:31.630 回答
0

可能的解决方案是将您的服务分配给类的静态变量

ClassToHandleError {
   private static loginService: LoginService;

   constructor(private loginService: LoginService) {
      ClassToHandleError.loginService = loginService;
   }

   private handleError(error: any) {
    console.error(error);
    console.log(ClassToHandleError.loginService); // here you can use static reference
    return Observable.throw(error);
   }
}

我知道这只是解决方法,rinukkusu 提供了比我更好的解决方案。我一直使用它,直到我解决了这个问题。但也许在某些特殊情况下,这对某人来说是有价值的:)。

于 2020-09-30T08:55:10.970 回答