Angular 从角度2的可观测数据中捕捉误差的正确方法是什么?

Angular 从角度2的可观测数据中捕捉误差的正确方法是什么?,angular,Angular,我正在跟随一个关于这个链接的教程 作者正在做一些我不太理解的事情。在catchAuthError方法中,他将服务自身的实例作为self传递,但他在方法本身中不使用该变量 import {Injectable} from '@angular/core'; import {Http, XHRBackend, RequestOptions, Request, RequestOptionsArgs, Response, Headers} from '@angular/http'; import {Obs

我正在跟随一个关于这个链接的教程

作者正在做一些我不太理解的事情。在catchAuthError方法中,他将服务自身的实例作为
self
传递,但他在方法本身中不使用该变量

import {Injectable} from '@angular/core';
import {Http, XHRBackend, RequestOptions, Request, RequestOptionsArgs, Response, Headers} from '@angular/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

@Injectable()
export class HttpService extends Http {

  constructor (backend: XHRBackend, options: RequestOptions) {
    let token = localStorage.getItem('auth_token'); // your custom token getter function here
    options.headers.set('Authorization', `Bearer ${token}`);
    super(backend, options);
  }

  request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
    let token = localStorage.getItem('auth_token');
    if (typeof url === 'string') { // meaning we have to add the token to the options, not in url
      if (!options) {
        // let's make option object
        options = {headers: new Headers()};
      }
      options.headers.set('Authorization', `Bearer ${token}`);
    } else {
    // we have to add the token to the url object
      url.headers.set('Authorization', `Bearer ${token}`);
    }
    return super.request(url, options).catch(this.catchAuthError(this));
  }

  private catchAuthError (self: HttpService) {
    // we have to pass HttpService's own instance here as `self`
    return (res: Response) => {
      console.log(res);
      if (res.status === 401 || res.status === 403) {
        // if not authenticated
        console.log(res);
      }
      return Observable.throw(res);
    };
  }
}
从'@angular/core'导入{Injectable};
从“@angular/Http”导入{Http,XHRBackend,RequestOptions,Request,RequestOptionsArgs,Response,Headers};
从“rxjs/Observable”导入{Observable};
导入'rxjs/add/operator/map';
导入“rxjs/add/operator/catch”;
@可注射()
导出类HttpService扩展Http{
构造函数(后端:XHRBackend,选项:RequestOptions){
让token=localStorage.getItem('auth_token');//您的自定义token getter函数在这里
options.headers.set('Authorization','Bearer${token}`);
超级(后端,选项);
}
请求(url:string |请求,选项?:RequestOptionsArgs):可观察{
let token=localStorage.getItem('auth_token');
if(typeof url==='string'){//意味着我们必须将令牌添加到选项中,而不是url中
如果(!选项){
//让我们把选项设为对象
选项={headers:newheaders()};
}
options.headers.set('Authorization','Bearer${token}`);
}否则{
//我们必须将令牌添加到url对象
set('Authorization','Bearer${token}`);
}
返回super.request(url,options).catch(this.catchAuthError(this));
}
私有catchAuthError(self:HttpService){
//我们必须在这里将HttpService自己的实例作为“self”传递`
返回(res:Response)=>{
控制台日志(res);
if(res.status==401 | | res.status==403){
//如果未经验证
控制台日志(res);
}
返回可观察。投掷(res);
};
}
}
评论中说:

我们必须将HttpService自己的实例作为
self

为什么有必要这样做?在这种情况下,我应该如何发现错误?正确的方法是什么?

做什么

return super.request(url, options).catch(this.catchAuthError(this));

实际上都是一样的,在最后2个闭包中创建一个闭包,在第一个闭包中创建一个引用组件的
this
。但你是对的,在这种情况下它是不必要的,因为它没有被使用

return(res:Response)=>{
中的
res
等于第三个示例中的error对象。
作者可能考虑过在超类中以某种方式使用
this
实例,但我认为这只是一个令人困惑的示例,可以简化为:

return super.request(url, options).catch((error)=>this.catchAuthError(error));


我得到错误:异常:Observable_1.Observable.throw不是一个函数。我必须做什么:导入'rxjs/add/Observable/throw';?我想
import{Observable}从'rxjs/Observable';
就足够了,正如文档中所说的那样。您的typescript配置可能有问题:| github上也有类似的问题:谢谢!顺便问一下,您知道他为什么在构造函数和请求中都添加头吗?仅仅在请求中添加头还不够吗?或者可能只是在构造函数中?Alex,但是在构造函数也为超类提供了选项。如果你想在实例化http后添加其他头,可能是因为我不太理解这个用法。当我们在构造函数中更改头时,在请求中更改头似乎没有意义。
return super.request(url, options).catch((err)=>this.catchAuthError(err));
return super.request(url, options).catch((error)=>this.catchAuthError(error));
private catchAuthError (error) {
      if (error.status === 401 || error.status === 403) {
        // if not authenticated
        console.log(error);
      }
      return Observable.throw(error);
    };
  }