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

Angular forkjoin url中的角度2/4错误处理,angular,rxjs,angular2-services,fork-join,Angular,Rxjs,Angular2 Services,Fork Join,我是usimg angular 2,我使用forkjoin实现一个场景,其中我必须并行执行多个rest调用 private getBatchObservableData(data: Array<Widget>): Observable<any> { let observableBatch = []; data.forEach(widget => { observableBatch.push(this._http.get(widget.a

我是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);
  }
私有getBatchObservableData(数据:数组):可观察{
让observableBatch=[];
data.forEach(小部件=>{
observeBatch.push(this._http.get(widget.apiPath).delay(500).map((数据)=>data.json()).share())
});
返回Observable.forkJoin(observableBatch);
}

这工作得很好。但是当任何一个rest调用失败时,整个WorkJoin都会失败。那么有没有办法发出这些rest调用的值并只记录失败的部分呢??请提供帮助。

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

私有getBatchObservableData(数据:数组):可观察{
让observableBatch=[];
data.forEach(widget=>observeBatch.push(this.\uHTTP
.get(widget.apiPath)
.延迟(500)
.map(data=>data.json())
.catch(错误=>可观察的(错误))
));
返回可观察的forkJoin,
(…结果)=>({
失败:results.map(r=>r instanceof Error?r:null),
成功:results.map(r=>r instanceof Error?null:r)
})
);
}
上面的示例将发射一个包含两个数组的对象,每个数组将包含与
数据
数组相同数量的元素:

  • 如果相应的请求失败,
    failed
    中的元素将包含一个
    错误
    ,否则
    null
  • 如果相应的请求成功,
    succeed
    中的元素将包含数据,否则,
    null
    中的元素将包含数据

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

使用
Catch(error=>Observable.of(error))捕获并发出组合HTTP可观察对象上的任何错误(作为值)
然后测试由
forkJoin
发出的数组中的值,以查看是否有
Error
实例。这基本上可以帮助我记录错误。但是那些成功的rest调用呢?有什么方法可以获取并显示成功的调用吗?哪些调用会很明显,对于那些调用,数组中会有非
Error
值,对于任何失败的调用,数组中都会有
Error
值。我会写一个答案让它更清楚。即使是为了让您的错误处理与http调用抛出的错误对象类型无关,您也可以将错误对象包装到特定于应用程序的错误对象中。这里的例子