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



我有一个函数需要从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,以便我只获得提取工作的文档,而忽略它失败的文档?或者我可以用不同的方式实现这一点?

干杯

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

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

请注意,您不能只使用empty()of(),因为它们都不会发出任何next项,combineLatest也不会按预期工作。当然,您可以使用任何您想要的东西,而不是null。文档数组将在源可观察失败的索引处null

最新更新