【问题标题】:Twin subscribes block forkJoin subscriptionTwin 订阅 block forkJoin 订阅
【发布时间】:2020-03-29 12:49:06
【问题描述】:

这是测试,在任何角度组件的 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

而且 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;
  }
}

【问题讨论】:

  • 你能发布两个 observables 的真正含义吗?
  • 完成,我删除了一些抽象级别以使其更清晰。简单来说,我有一个 store,如果不初始化,很快就会触发,所以事件会触发两次

标签: angular typescript rxjs rxjs-observables


【解决方案1】:

forkJoin 等待所有 observables 完成,在此之前它不会发出任何东西,正如这里的文档中所说:https://rxjs-dev.firebaseapp.com/api/index/function/forkJoin

请考虑使用:

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

为了用forkJoin完成它,你必须完成你的两个observables,它可以通过多种方式完成,例如使用take(n)、takeUntil($end)或takeWhile(x =&gt; x &gt; 5)等。在最后一个observable之后完成后,您将在控制台中看到“d”。

【讨论】:

    【解决方案2】:

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

    所以对于这个场景,你可以使用CombineLatest。

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2017-11-12
      • 1970-01-01
      • 2020-10-17
      相关资源
      最近更新 更多