【问题标题】:Angular 2/4 Error handling in forkjoin urlforkjoin url中的Angular 2/4错误处理
【发布时间】:2017-10-26 04:54:17
【问题描述】:

我是 usimg 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);
  }

这工作得非常好。但是当任何一个其余调用失败时,wholeforkjoin 都会失败。所以有没有办法发出这些休息调用的值并记录失败的情况。 ??请帮忙。

【问题讨论】:

  • 使用catch(error =&gt; Observable.of(error))在组合的HTTP observables上捕获并发出任何错误(作为值),然后测试forkJoin发出的数组中的值,看看是否有Error实例。
  • 这基本上可以帮助我记录错误。但是那些成功的其余调用呢?有没有办法获得并显示?
  • 哪些调用成功是显而易见的,对于那些调用,数组中的非Error 值和失败的任何调用的Error 值。我会写一个答案以使其更清楚。

标签: angular rxjs angular2-services fork-join


【解决方案1】:

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

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

【讨论】:

  • 即使让您的错误处理与 http 调用抛出的错误对象类型无关,您也可以将错误对象包装到您的应用程序特定的错误对象中。这里的例子stackblitz.com/edit/typescript-7xqy8g
猜你喜欢
  • 2019-01-30
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多