首页 > 解决方案 > rxJs forkJoin 不会从已完成的非空输入 Observables 中发出任何值

问题描述

这里的主要内容:两个输入 Observable 发出值,这些值不为空,并且它们都完成了。我还能错过什么?

this.availableHours$.subscribe(res => console.log(res)); 
this.selectedDays$.subscribe(res => console.log(res));
forkJoin([this.availableHours$, this.engagedTime$]).subscribe(() => console.log('hello'));

我检查了它们是否分别完成并发出值console.log。结果是:

{ availableHoursByDay: undefined } // availableHours$
{ startDate: '23.09', endDate: '25.09' } // selectedDays
{ availableHoursByDay: uundefined } // availableHours$
{ availableHoursByDay: uundefined } // availableHours$
{ availableHoursByDay: { '23.09': 1,2,3,4, '25.09': 7,4,6 } } // availableHours$

并且 forkJoin 中的 'hello' 没有输出到控制台:(

所以看起来它们确实已经完成并且发出非空值。两个 Observable 都来自 store(它们是从 api 调用收到一个,从 routeParams 收到另一个,然后存储到 store)

我在这里还缺少什么?

更新。 根据评论(大家非常感谢),我发现商店 Observables 从未完成(几乎从未完成)。

所以现在我还有一个问题:

我需要跟踪更改selectedDays$并仅获取最后一个发出的值availableHours$(而不是未定义的属性)。只有最后一个。这是非常重要的,只有一个

我以这种方式实现了 combineLatest

   combineLatest([this.selectedDays$, availableHours$.pipe(
      filter(availableHours => !!availableHours.availableHoursByDay),
      first()
    ))
      .subscribe(([datesRange, availableHours]) => {
        this.processBookingDatesChange(datesRange, availableHours);
      }); 

但我一直在寻找更优雅的东西。我可以在这里做什么?

标签: angularrxjsobservable

解决方案


forkJoin 在所有可观察对象都完成时发出,而不是在它们发出值时发出。这是一个很大的区别。

很可能你想要 combineLatest 的特性,它会在所有的 observable 发射后发射。


推荐阅读