Twin 订阅区块分叉加入订阅

Twin subscribes block forkJoin subscription

这是测试,在任何 angular 组件的 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 次,这是我需要的行为,这个 observable 将观察到一个可以在初始化期间快速更改的值。

结果是:

a
b
b
c

而且我从不登录。 所以,我首先尝试做同样的事情,但只使用 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;
  }
}

forkJoin 等待所有可观察对象完成,直到那时它不会发出任何东西,正如此处文档中所说:https://rxjs-dev.firebaseapp.com/api/index/function/forkJoin

请考虑使用:

  • combineLatest 如果你希望它在任何时候都被触发 observables 发出一些东西。 Link
  • withLatestFrom 如果你想让它开火 当其中一个可观察对象发出某些东西时(第一个)。 Link
  • zip 如果你想组合每一对 Link

为了用 forkJoin 完成它,您必须完成两个 observables,可以通过多种方式完成,例如使用 take(n)takeUntil($end)takeWhile(x => x > 5) 等。在最后一次观察完成后,您将在控制台中看到 'd'。

在此场景中,Observables 未完成。 ForkJoin 通常用于已完成的可观察对象,即 HTTP 请求。

因此对于这种情况,您可以使用CombineLatest

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

欲了解更多信息,请访问:combineLatest