gpt4 book ai didi

Angular forkJoin 订阅未触发

转载 作者:行者123 更新时间:2023-12-03 08:28:44 26 4
gpt4 key购买 nike

我有几种形式的方法

    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)...

zip example

关于Angular forkJoin 订阅未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65800019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com