angular 2 - 在 http 错误处理程序中注入服务

angular 2 - Injected service in http error handler

我在文档中有一个 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.loginServiceundefined 尽管它已正确注入我的 class .它已经在其他方法中使用,但似乎在 handleError.

中不可用

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

这是我如何将 handleError 方法设置为回调的示例(与文档完全一样)

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

this in handleError 你的情况可能不是你想的那样。

尝试执行以下操作:

this.http.get(url,
              ApiRequest.ACCEPT_JSON)
              .map(ApiHelper.extractData) 
              .catch(this.handleError.bind(this)); // <-- add .bind(this)

由于您直接传递函数,因此您没有 class 的 this 上下文。一个非常简单和最佳实践的方法是使用 lambda 或 "fat arrow function":

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

关于何时使用 lambda 的非常好的读物:

可能的解决方案也是将您的服务分配给 class

的静态变量
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 提供了比我更好的解决方案。我用它直到我解决了这个问题。但也许在某些特殊情况下,这对某些人来说很有价值 :) .