Angular 2/4 forkjoin url 中的错误处理

标签 angular rxjs angular2-services fork-join

我正在使用 Angular 2,并且我正在使用 forkjoin 来实现必须并行执行多个 Rest 调用的场景之一。以下是我的函数

 private getBatchObservableData(data: Array<Widget>): Observable<any> {
    let observableBatch = [];
    data.forEach(widget => {
      observableBatch.push(this._http.get(widget.apiPath).delay(500).map((data) => data.json()).share())
    });
    return Observable.forkJoin(observableBatch);
  }

这工作得很好。但是当任何一个其余调用失败时,整个forkjoin都会失败。那么有没有办法发出这些其余调用的值并只记录失败的值。 ??请帮忙。

最佳答案

如果您使用 catch 来防止错误冒泡到 forkJoin 调用,您可以将它们作为值重新发出,并可以检查 forkJoin< 中的值 的可选项目函数:

private getBatchObservableData(data: Array<Widget>): Observable<any> {
  let observableBatch = [];
  data.forEach(widget => observableBatch.push(this._http
    .get(widget.apiPath)
    .delay(500)
    .map(data => data.json())
    .catch(error => Observable.of(error))
  ));
  return Observable.forkJoin(observableBatch,
    (...results) => ({
      failed: results.map(r => r instanceof Error ? r : null),
      succeeded: results.map(r => r instanceof Error ? null : r)
    })
  );
}

上面的示例将发出一个包含两个数组的对象,每个数组包含与 data 数组相同数量的元素:

  • 如果相应的请求失败,failed 中的元素将包含 Error,否则为 null
  • 如果相应的请求成功,succeeded 中的元素将包含数据,否则 null

如果您需要做一些不同的事情,那么重新安排事情应该很容易。

关于Angular 2/4 forkjoin url 中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46946100/

相关文章:

javascript - 使用 Redux-Observable 调度延迟的第二个操作,同时保留第一个操作

javascript - 这个 Angular 2 应用程序中的服务层次结构究竟是如何工作的?

angular - 我如何从选择的组件中获取选定的值

node.js - Angular2 BrowserSync 双向 SSL

javascript - 检测单词和句子的完成情况

angular - 为什么当 http.post 失败时 zone.js 在有捕获和返回对象时抛出 404 Not Found

Angular 2 模块没有导出成员

angular - RxJS 根据请求时间更改加载指示消息

angular - 使用 Angular 2 通过回车键关注下一个输入字段

angularjs - 遍历对象数组Angular 2