【问题标题】:RxJs - forkJoin with empty arrayRxJs - forkJoin 与空数组
【发布时间】:2021-02-12 03:05:15
【问题描述】:

我目前正在使用forkJoin 等待Observable(s) 的数组在pipe(ing) 和tap(ping) 之前完成。

我注意到如果数组为空,则不会发出任何内容,我什至不能tap。我该如何解决这种问题?我应该只检查数组是否为空吗?

myFirstFunction(...) {
   const observables = ...
   return forkJoin(observables)
}

mySecondFunction(...) {
   return myFirstFunction().pipe(tap(() => ...))
}

【问题讨论】:

    标签: rxjs


    【解决方案1】:

    那是因为forkJoin 要求所有源 Observables 至少发射一个项目,而当没有源 Observables 时没有任何东西可以发射。但是,forkJoin 仍会发送complete 通知,因此您可以使用例如defaultIfEmpty 运算符来确保它始终发出至少一个next

    forkJoin(observables).pipe(
      defaultIfEmpty(null),
    ).subscribe(...);
    

    演示:https://stackblitz.com/edit/rxjs-kkd1qa?file=index.ts

    【讨论】:

    • 谢谢马丁。 “仍将发送完整通知”仅与 forkJoin 运算符相关还是更笼统?
    • 这和forkJoin的内部功能有关。
    • 我问是因为我正在查看此页面learnrxjs.io/operators/combination/forkjoin.html 并没有发现任何提及这一点。哦,顺便说一句,必须使用defaultIfEmpty([])
    • 这是边缘情况,所以我并不惊讶它没有在那里提到。我认为即使在官方文档中也没有提到这种行为。你可以看到它在这里确实有效stackblitz.com/edit/rxjs-kkd1qa?file=index.ts
    【解决方案2】:

    除了马丁的回答。

    我有 2 个 observable 返回数组,如果其中一个给我一个空数组,它不会等待另一个 observable 完成并立即完成。您可以使用defaultIfEmpty处理如下情况。

    const response1: Observable<any[]> = this.service.getResponse(params1).pipe(defaultIfEmpty([]));
    const response2: Observable<any[]> = this.service.getResponse(params2).pipe(defaultIfEmpty([]));
    
    Observable.forkJoin(response1, response2).subscribe((response) => {
      console.log(response);
    }, () => {
      console.log('handle error here');
    }, () => {
      console.log('completed');
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2022-12-05
      • 1970-01-01
      • 2020-02-26
      • 2021-03-10
      • 2018-10-02
      • 2016-10-29
      相关资源
      最近更新 更多