在触发promise之后,在catch子句中使用this关键字将"this“报告为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实际上是未定义的。关于如何解决这个问题,更重要的是,为什么会发生,有什么建议吗?
发布于 2018-06-11 21:10:02
这一切的发生是因为当你这样做的时候
.catch(this.handleErrorResponse);在这里,this对其作用域有限制。它目前是catch函数的一个作用域。
你需要的是一个lexical scoping
ES6箭头函数语法使用“词法作用域”来确定“
”的值应该是什么。词法作用域是一种奇特的方式,它使用周围代码…中的“this”包含相关代码的代码。
所以当我们这样做的时候
.catch(err => this.handleErrorResponse(err)); //here this points to its module's scope发布于 2018-06-11 20:59:01
尝试使用以下语法:
.catch(err => this.handleErrorResponse(err));发布于 2018-06-12 19:42:03
通过内部函数修复:
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'])
}
});
}https://stackoverflow.com/questions/50798298
复制相似问题