代码之家  ›  专栏  ›  技术社区  ›  JBoy

在履行承诺后从catch子句中访问“这个”

  •  1
  • JBoy  · 技术社区  · 6 年前

    使用 this 关键字来自 catch 条款承诺后报告“此”为 undefined .
    我想做的很简单,我有一个 Router 对象注入到服务的构造函数中,从方法I通过客户端触发HTTP请求,以防响应 !=2* 然后我想重定向用户。
    由于某种原因,当前对象(服务)似乎不见了,它看起来像 抓住 在完全不知道服务的另一个线程中执行: 施工单位:

    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 最终会抛出一个错误 实际上是未定义的。 有什么建议我能解决这个问题,更重要的是,为什么会发生这种情况?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Manoz    6 年前

    这一切都是因为当你

    .catch(this.handleErrorResponse);
    

    在这里 this 对其范围有限制。目前的范围是 catch 功能。

    你需要的是 lexical scoping

    Es6-箭头函数语法使用E.Syr词法范围内的 “this”的值应该是多少?词汇范围是一种很有意思的方式。 说它从周围的代码中使用这个 包含有问题的代码。

    所以当我们这样做的时候

    .catch(err => this.handleErrorResponse(err)); //here this points to its module's scope
    
        2
  •  0
  •   Maryannah    6 年前

    尝试使用以下语法:

    .catch(err => this.handleErrorResponse(err));
    
        3
  •  0
  •   JBoy    6 年前

    修正了它的内部功能:

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