1

这是任何角度组件的 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;
  }
}

4

2 回答 2

1

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

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

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

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

于 2019-12-04T16:58:09.380 回答
1

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

请考虑使用:

  • combineLatest如果您希望每次任何可观察对象发出某些东西时都会触发它。关联
  • withLatestFrom如果您希望它在其中一个可观察对象发出某些东西(第一个)时触发。关联
  • zip如果你想组合每一对链接

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

于 2019-12-04T16:52:00.210 回答