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.loginService 是 undefined 尽管它已正确注入我的 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 提供了比我更好的解决方案。我用它直到我解决了这个问题。但也许在某些特殊情况下,这对某些人来说很有价值 :) .
我在文档中有一个 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 是 undefined 尽管它已正确注入我的 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 提供了比我更好的解决方案。我用它直到我解决了这个问题。但也许在某些特殊情况下,这对某些人来说很有价值 :) .