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