2016-05-23 129 views
2

我理解Observable数据服务的核心概念,但是当我需要更强大的服务时会遇到麻烦。Angular 2 Observable http服务错误处理

对于用户查询,我必须创建一个http调用链,以便首先查询用户对象,然后在抓取用户对象后查询其他数据。由于这些额外的调用取决于抓取的用户对象。用户可以通过接收整个用户对象的任何额外数据来获取这些数据。

我目前使用userSource.mergeMap(user => extraDataNeeded(user))返回组合的Observables。 其中extraDataNeeded返回Observable.forkJoin(...OBSERVABLES) OBSERVABLES是一个http调用数组,它向用户对象添加额外的数据。

我的问题是,当这些额外的http调用之一失败,链中的其余部分被取消。我希望从userSource.mergeMap(user => extraDataNeeded(user))创建的最高可观察值可以使所有的http调用无论如何失败。我希望userSource.mergeMap(user => extraDataNeeded(user))的用户能够接收到用户对象的任何可以抓取的数据,以及任何内部http调用失败的错误。如果原始userSource失败,则完全失败,并且没有成功。

回答

2

您可以将catch块添加到您的每个OBSERVABLES,使得故障响应只会返回next块中的错误主体。

source1.catch(e => Rx.Observable.of({error: e})); 
source2.catch(e => Rx.Observable.of({error: e})); 

//or made modular 

function handler(e) { return Rx.Observable.of({error: e})); 

var safeSource1 = source1.let(handler); 
var safeSource2 = source2.let(handler); 

然后构建对象时,你只需要妥善处理这些错误:从userSourceObservable

Rx.Observable.forkJoin(safeSource1, safeSource2, sources => { 
    //Totally made up 
    var combined = {components: [], errors: []}; 
    for (let resp of sources) { 
    if (resp.error) 
     combined.errors.push(resp.error); 
    else 
     combined.components.push(resp); 
    } 
}); 

错误仍然会传递到错误处理程序,并绕过完全是forkJoin