RxJS 和 AngularJS HTTP - 我怎样才能做到这一点?
RxJS and AngularJS HTTP - how can I achieve this?
我正在编写一个小的实用函数,它用必要的身份验证包装对 AngularJS http.get 的调用 headers:
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,该方法就会崩溃。
所以我有三个选择:
- Return null 并在每次调用时检查 return 值...
- 抛出异常
- 找到一种方法也 return 一个 RxJS Observable object 将直接触发错误处理程序。
我想实现第三种方法,因为它可以让我统一此方法的行为:无论发生什么,它总是 return 是一个可观察的。
- 你知道怎么做吗?
- 我是否必须创建一个新的 Observable 并将这两者合并?
- 我能做什么?
如果 user
是 null
,您可以简单地 return 触发错误的原始可观察对象:
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
}
);
我认为最干净的方法是将整个函数体包装到一个可观察的对象中,因为它将把任何意外错误转化为可观察的错误。像这样:
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();
}
我正在编写一个小的实用函数,它用必要的身份验证包装对 AngularJS http.get 的调用 headers:
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,该方法就会崩溃。 所以我有三个选择:
- Return null 并在每次调用时检查 return 值...
- 抛出异常
- 找到一种方法也 return 一个 RxJS Observable object 将直接触发错误处理程序。
我想实现第三种方法,因为它可以让我统一此方法的行为:无论发生什么,它总是 return 是一个可观察的。
- 你知道怎么做吗?
- 我是否必须创建一个新的 Observable 并将这两者合并?
- 我能做什么?
如果 user
是 null
,您可以简单地 return 触发错误的原始可观察对象:
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
}
);
我认为最干净的方法是将整个函数体包装到一个可观察的对象中,因为它将把任何意外错误转化为可观察的错误。像这样:
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();
}