通过可观察的角度处理错误

时间:2018-04-12 11:42:44

标签: angular typescript observable

在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>)的方法捕获错误?

2 个答案:

答案 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 BehaviorSubjectObservable,发现前者是有状态而后者是无状态

我检查了我的代码并发现,因为我使用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);

但是,它将所需的错误对象发送到调用服务,但它在成功时发生,而不是在出错时。简而言之,抓住错误并不是一个好的做法。