以下是任意角度分量的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;
}
}
答案 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