在扩展Angular2 HTTP Client时,如何在rxjs Observable外部运行方法?

时间:2016-05-31 18:47:10

标签: typescript angular rxjs ionic2 angular2-http

我为我的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 );
}
&#13;
&#13;
&#13;

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

1 个答案:

答案 0 :(得分: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) );
}

在TypeScript中使用bind方法时,您需要注意这个缺点: