Twin订阅块forkJoin订阅

时间:2019-12-04 16:36:12

标签: angular typescript rxjs rxjs-observables

以下是任意角度分量的ngInit中的测试:

console.log('a');

observableFoo$.subscribe(x => console.log('b'));
observableNotFoo$.subscribe(() => console.log('c'));

forkJoin([
  observableFoo$,
  observableNotFoo$
]).subscribe(([foo, ntFoo]) => {
  console.log('d');
});

ObservableFoo $将触发2次,这就是我需要的行为,该可观察值将观察到一个在初始化期间可以快速更改的值。

结果是:

a
b
b
c

d永不登录。 因此,我首先尝试执行相同的操作,但是仅使用ObservableNotFoo $只是为了确保我可以在单个Observable上进行forkJoin(无用,但它可以工作),然后我使用ObservableFoo $尝试了相同的操作,但它不起作用。

似乎forkJoin不接受将触发两次的订阅。是这样吗?看起来真的很奇怪...

**编辑:**

observableFoo$ = initFoo(this.id); 

observableNotFoo$ = of('notFoo');


initFoo(id: string): Observable<any> {
 const content = this.store.select({
      filterBy: entity => entity.id === id
    }).pipe(
      flatMap(v => {
        const value = v[0];
        if (!value) {
          return httpRequest.get(this.baseUrl + '/' + id).pipe(map(val => {
            this.store.add(val);
            return val;
          }));
        }
        return of(value);
      })
    );
    return content;
  }
}

2 个答案:

答案 0 :(得分:1)

forkJoin等待所有可观察到的物体完成,直到它不会发出任何东西为止,如此处的文档所述:https://rxjs-dev.firebaseapp.com/api/index/function/forkJoin

请考虑使用:

  • combineLatest,如果您希望每次以下任何时候都将其触发 可观察对象发出一些东西。 Link
  • withLatestFrom(如果您希望它触发) 当其中一个可观察对象发出某物时(第一个)。 Link
  • zip,如果您想组合每对Link

为了用forkJoin完成它,您必须完成两个可观察项,可以用很多方法完成,例如使用take(n)takeUntil($end)或{{ 1}}等。最后一个可观察值完成后,您将在控制台中看到“ d”。

答案 1 :(得分:1)

在此方案中,可观察对象未完成。 ForkJoin通常用于完成的可观察对象,即HTTP请求。

因此,在这种情况下,您可以使用CombineLatest

combineLatest(observableFoo$, observableNotFoo$).subscribe(([foo, ntFoo]) => {
    console.log(foo, ntFoo);
})

有关更多信息,请访问:combineLatest