0

我正在为我的 Angular2 打字稿应用程序创建一个 HttpClient,但我陷入了错误处理程序。

我想在捕获 401 错误时发出事件,并且我能够捕获错误但不能触发我的事件,因为 .catch 需要附加到 Observable 类型的函数,所以我无法访问我的 HttpClient 类这个范围。

errorHandler (error:any) : Observable<any> {
  if(error.status == 401) {
    // I want to call this.myOtherMethod() here!
    this.events.publish('token_expired'); // Will throw this.events is undefined
    console.log(error);
  }

  return Observable.throw(error.json());
}

get(url) : Observable<any> {
  return this.http.get(url, {
    headers: this.customHeaders
  }).catch( this.errorHandler );
}

所以我知道我无法从这个函数内部访问我的 this.events,但是解决方法是什么?我怎样才能在那里注入事件?

4

1 回答 1

1

问题是您引用了该errorHandler方法,因此您丢失了this关键字的值。这就是 JavaScript 的工作方式。

您可以尝试以下方法来防止这种情况:

get(url) : Observable<any> {
  return this.http.get(url, {
    headers: this.customHeaders
  }).catch( (error:any) => {
    return this.errorHandler(error);
  });
}

或者

get(url) : Observable<any> {
  return this.http.get(url, {
    headers: this.customHeaders
  }).catch( this.errorHandler.bind(this) );
}

bind在TypeScript中使用该方法时,您需要注意它的缺点:

于 2016-05-31T18:49:51.740 回答