首页 文章

Angular 2 Observable http服务错误处理

提问于
浏览
2

我理解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调用失败的任何错误 . 如果原始_1382983失败,则完全失败并且没有成功响应 .

1 回答

  • 2

    您可以为每个 OBSERVABLES 添加一个 catch 块,以便故障响应只返回 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 .

相关问题