我正在编写一个小实用程序函数,它使用必要的身份验证标头包含对AngularJS http.get的调用:
get(endpoint: string): Observable {
var headers = new Headers();
this._appendAuthentificationHeaders( headers, this.user.credentials);
return this.http.get(endpoint, { headers: headers })
.map(res => res.json());
}
这里的要点是,如果 this.user 为null,则该方法将崩溃。 所以我有三个选择:
我想实现第三种方法,因为它可以让我统一这种方法的行为:无论发生什么,它总会返回一个可观察的方法。
答案 0 :(得分:3)
如果user
为null
,您只需返回触发错误的原始观察值:
if (this.user == null) {
return Observable.create((observer) => {
observer.error('User is null');
});
}
(...)
或利用throw
运算符:
if (this.user == null) {
return Observable.throw('User is null');
}
(...)
这样将调用subscribe
方法的第二种方法:
observable.subscribe(
(data) => {
(...)
},
(err) => {
// Will be called in this case
}
);
答案 1 :(得分:0)
我认为最干净的方法是将整个函数体包装到一个observable中,因为它会将任何意外错误转换为可观察到的错误。像这样:
get(endpoint: string): Observable {
return Rx.Observable.defer(() => {
var headers = new Headers();
this._appendAuthentificationHeaders(headers, this.user.credentials);
return Rx.Observable.just(headers);
})
.flatMap(headers => this.http.get(endpoint, { headers: headers }))
.map(res => res.json());
}
但是我仍然不同意http.get
返回一个可观察而不是一个承诺。由于这些是单值可观察的,你的函数可能是一个简单的异步函数(sry,js而不是ts):
async get(endpoint) {
var headers = new Headers();
this._appendAuthentificationHeaders(headers, this.user.credentials);
const res = await this.http.get(endpoint, { headers })).toPromise();
return res.json();
}