我有几种形式的方法
getFirstDataBunch() {
return this.repository.getData(this.parameter).pipe(
switchMap(
result => {
//Do something with result;
return of(true);
}
)
);
}
然后我将我的 ngOnInit
调用为:
function ngOnInit(){
forkJoin(this.getFirstDataBunch(), this.getSecondDataBunch(), this.getThirdDataBunch()).subscribe(
results => {
//do stuff with results;
}
);
}
我可以看到所有的可观察对象都被调用,并且它们返回一个可观察对象,但是从我读到的forkJoin
来看,forkJoin
Subscribe 方法从未被调用仅当所有可观察对象返回并完成时才会触发,我确实相信情况如此,那么为什么不触发呢?
我还发现有些人只是选择 combineLatest
,但因为这些方法仅返回一次,所以我实际上不需要继续寻找它们的更新。
最佳答案
我只需使用您想要/需要的组合运算符,并使用 take(1)
对其进行管道传输。
为什么使用 take()
运算符?
因为take返回一个Observable,它仅发出源Observable发出的前X个值。我们设定了多少排放量。
示例:
import { of } from 'rxjs';
import { take } from 'rxjs/operators';
//emit 1,2,3,4,5
const source = of(1, 2, 3, 4, 5);
//take the first emitted value then complete
const example = source.pipe(take(1));
//output: 1
const subscribe = example.subscribe(console.log);
//output: 1, 2, 3
const example2 = source.pipe(take(3)).subscribe(console.log);
如果你想 100% 确定避免任何可能的内存泄漏,我建议也使用 takeUntil()
(因为 take(1) 可能会由于某种原因永远卡住,如果可观察的永远不会发射)
.pipe(take(1), takeUntil(this.destroy$))
作为一般建议,始终将 takeUntil()
作为管道的最后一个参数。
关于什么组合运算符:
forkJoin
--> 正如您所写,等待所有可观察对象完成,然后从每个可观察对象中发出最后发出的值(如 Promise.all
)。它可以工作,但是每个可观察的对象都需要完成(而不仅仅是发出!)。
zip
--> 等待所有可观察值发出,然后将值作为数组发出(按顺序 - 下图)。我可能会用这个。
combineLatest
--> 等待所有可观察对象发出,发出一次。然后,每当任何输入 Observable 发出一个值时,它都会发出发出的 Observable 的新值以及其他 Observable(未发出的)的最后一次发出的值。当然,这也适用于 take(1)
...
关于Angular forkJoin 订阅未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65800019/