即使一个失败,Observable.combineLatest仍会继续

时间:2018-09-10 14:57:44

标签: angular typescript rxjs

我有一个需要从firebase解析多个文档的功能

  fetchDocuments(documentIds: string[]): Observable<TreeNodeDocument[]> {
    const observables = [];
    for(let id of documentIds){
      observables.push(this.fetchDocument(id));
    }
    return Observable.combineLatest(observables, (...docs: TreeNodeDocument[]) => {
      //some transformations on the resolved documents
      return docs;
    });
  }

this.fetchDocument(id)返回类型为TreeNodeDocument的可观察值。

只要可以解决所有文档,此功能就起作用。现在有时会发生某些文档无法解析的情况,那么相应的fetchDocument(id)可观察项将失败。可以并希望某些文档无法解决。但是,如果Observable.combineLatest其中之一失败,则完全失败(我知道这是一种很好的默认行为)。

我现在的问题是,我可以以某种方式使用combineLatest以便仅获取可以进行提取的文档,而忽略失败的文档吗?还是可以通过其他方式实现这一目标?

欢呼

1 个答案:

答案 0 :(得分:4)

您可以使用this.fetchDocument(id)用管道传输每个源Observable(每个catchError),它将用虚拟error项目(或您想要的任何内容)替换next通知。 / p>

for (let id of documentIds){
  observables.push(this.fetchDocument(id).pipe(
    catchError(() => of(null)),
  ));
}

...

请注意,您不能仅使用empty()of(),因为它们都不会发出任何next项,并且combineLatest不能像您一样工作期望。当然,除了null之外,您还可以使用任何您想要的东西。文档数组将在源Observable失败的索引处带有null