【问题标题】:Observable.combineLatest continue even if one failsObservable.combineLatest 即使失败也会继续
【发布时间】:2018-09-10 14:57:43
【问题描述】:

我有一个需要从 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 类型的 observable。

只要可以解析所有文档,此功能就可以工作。现在有时会发生某些文件无法解析的情况,那么相应的fetchDocument(id) observable 就会失败。没关系,预计某些文件无法解决。但是,如果其中一个失败,Observable.combineLatest 将完全失败(我知道这是一个很好的默认行为)。

我现在的问题是,我能否以某种方式使用combineLatest,这样我就只获得了提取有效的文档而忽略了它失败的文档?或者我可以通过其他方式实现这一目标吗?

干杯

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    您可以使用 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。文档数组将在源 Observable 失败的索引处包含 null

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多