在触发承诺报告后,在this
子句中使用catch
关键字"此"因为undefined
。我想做的很简单,我在服务的构造函数中注入一个Router
对象,从我通过客户端发出http请求的方法,如果是响应!=2*
,那么我想重定向用户
出于某种原因,当前对象(服务)似乎消失了,看起来catch
在另一个完全不知道服务的线程中执行:
构造函数:
constructor(private router: Router) { }
public sendRequestOrRedirect(){
var url = environment.url
var json = //someJSON here
return this.httpClient.patch(url,json).toPromise().then(res=>{
return res;
}).catch(err => this.handleErrorResponse(err));
}
private handleErrorResponse (error: Response | any) {
if(error.status == 401){
this.router.navigate['/getout'];
return Promise.reject(error.status);
}
}
}
因此this.router
的结果最终会抛出错误,说this
实际上是未定义的。
关于我如何解决这个问题的任何建议,更重要的是,它为什么会发生?
答案 0 :(得分:2)
这一切都在发生,因为当你做的时候
.catch(this.handleErrorResponse);
此处this
的范围有限制。它目前是catch
函数的范围。
您需要的是lexical scoping
ES6箭头函数语法使用“词法范围”来弄清楚 “这”的价值应该是多少。词汇范围是一种奇特的方式 说它使用周围代码中的“this”...代码 包含有问题的代码。
所以当我们做的时候
.catch(err => this.handleErrorResponse(err)); //here this points to its module's scope
答案 1 :(得分:0)
尝试使用以下语法:
.catch(err => this.handleErrorResponse(err));
答案 2 :(得分:0)
使用内部函数修复它:
constructor(private router: Router) { }
public sendRequestOrRedirect(){
var url = environment.url
var json = //someJSON here
return this.httpClient.patch(url,json).toPromise().then(res=>{
return res;
}).catch((err) => {
if(err.status == 401){
console.log("Got a 401")
this.router.navigate(['/getout'])
}
});
}