我有一个需要从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
以便仅获取可以进行提取的文档,而忽略失败的文档吗?还是可以通过其他方式实现这一目标?
欢呼
答案 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
。