Angular 2 Observable http服务错误处理

时间:2016-05-23 17:07:03

标签: angular rxjs observable

我理解Observable数据服务的核心概念,但在需要更强大的服务时遇到了麻烦。

对于用户查询,我必须进行一系列http调用,以便首先查询用户对象,然后在获取用户对象后查询其他数据。由于这些额外的调用取决于抓取的用户对象。订阅者可以使用任何额外的数据接收整个用户对象。

我目前正在使用userSource.mergeMap(user => extraDataNeeded(user))来返回组合的Observable。 extraDataNeeded返回Observable.forkJoin(...OBSERVABLES)的位置 OBSERVABLES是一个http调用数组,用于向用户对象添加额外数据。

我的问题是,当其中一个额外的http调用失败时,链中的其余部分将被取消。我希望从userSource.mergeMap(user => extraDataNeeded(user))创建的最高阶可观察量,如果一个失败,无论如何都可以进行所有http调用。我希望userSource.mergeMap(user => extraDataNeeded(user))的订阅者能够接收到能够获取的任何数据的用户对象,以及任何内部http调用失败的任何错误。如果原始userSource失败,则完全失败并且没有成功响应。

1 个答案:

答案 0 :(得分: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);

然后在构建对象时,您只需要适当地处理这些错误:

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);
  }
});

来自userSource Observable的错误仍会传递给错误处理程序并完全绕过forkJoin