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

时间:2017-10-26 04:54:17

标签: angular rxjs angular2-services fork-join

我是usimg angular 2,我使用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()).share())
    });
    return Observable.forkJoin(observableBatch);
  }

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

1 个答案:

答案 0 :(得分:2)

如果您使用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

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