在Angular中的服务上,在下面的api调用中,捕获错误的方法是什么:
getData(sourceId: string): Observable <Array<CustomObject>> {
const obs: BehaviorSubject<Array<CustomObject>> = this.servicesObsCache[sourceId];
const options = new RequestOptions({...});
this.http
.get(API_URL + 'sourceId' + '/serviceendpoint', options, true)
.map(res => res.json())
.first()
.subscribe(
body => {
...
obs.next(services);
},
err => {
obs.next(err); // Is this statement allowed on error?
obs.error(err);
}
);
return obs.filter((results) => !!results);
}
我尝试使用obs.next(err);
,但我相信当 api失败时它不会捕获错误,而是将其视为成功。< / p>
我应该使用什么来允许调用getData(<custom_id>)
的方法捕获错误?
答案 0 :(得分:0)
You have to catch http error before subscription like the following.
this.http.get(url).map((response) => response).catch((e) => {
//Catching based on http error code.
if(e.status == 400){
//Do anything based on http status code.
}
//Throw Custom error message.
return Observable.throw(new Error(`${ e.status } ${ e.statusText }`));
});
答案 1 :(得分:0)
我研究了difference between BehaviorSubject
和Observable
,发现前者是有状态而后者是无状态。
我检查了我的代码并发现,因为我使用BehaviorSubject
,出错,因为它是有状态的,它总是包含错误obect。因此,当我在进行api调用之前尝试执行以下代码时:
obs.getValue();
它通过打破理想流程并阻止进行服务调用来返回错误。
因此,我使用了Observable
,如下所示:
getData(sourceId: string): Observable<Array<CustomObject>> {
return Observable.create(obs => {
const options = new RequestOptions({ ...});
this.http
.get(API_URL + 'sourceId' + '/serviceendpoint', options, true)
.map(res => res.json())
.first()
.subscribe(
body => {
...
obs.next(services);
},
err => obs.error(err);
);
});
}
使用此方法,错误将通过其订阅的Observable
错误处理来处理。
此外,不应在错误处理中使用以下代码:
obs.next(err);
但是,它将所需的错误对象发送到调用服务,但它在成功时发生,而不是在出错时。简而言之,抓住错误并不是一个好的做法。