访问'这个'在发出承诺后来自catch子句

时间:2018-06-11 12:56:21

标签: angular

在触发承诺报告后,在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实际上是未定义的。 关于我如何解决这个问题的任何建议,更重要的是,它为什么会发生?

3 个答案:

答案 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'])
          }
        });
    }