gpt4 book ai didi

angular - 用于可观察链接的仓促 forkjoin 替代 rxjs?

转载 作者:行者123 更新时间:2023-12-02 10:38:15 26 4
gpt4 key购买 nike

我要进行 5 个不同的 API 调用,它们现在都链接在 forkJoin 中。我的新要求是订阅应该在任何新的可观察解决方案时触发。

rxjs 中是否有任何运算符或任何其他技巧可以让我保持链接,但是每次任何可观察的解决时它都应该触发?

forkJoin(
this.myService.api1(),
this.myService.api2(),
this.myService.api3(),
this.myService.api4(),
this.myService.api5()
)
.subscribe(
([r1,r2,r3,r4,r5]) => { ... do something })

最佳答案

您可以使用combineLatest从每个可观察源发出最新值。在每个源可观察对象至少发出一次之前,它不会发出,因此您可以使用 startWith 提供起始值:

combineLatest(
this.myService.api1().pipe(startWith(null)),
this.myService.api2().pipe(startWith(null)),
this.myService.api3().pipe(startWith(null)),
this.myService.api4().pipe(startWith(null)),
this.myService.api5().pipe(startWith(null))
)
.subscribe(
([r1,r2,r3,r4,r5]) => { ... do something })

初始输出将为[null, null, null, null, null]。当每个 observable 发出时,它将替换数组中相应的 null 值。

如果您想忽略初始发射,可以使用skip(1)

const sourceOne = of('Hello').pipe(delay(1000));
const sourceTwo = of('World!').pipe(delay(2000));
const sourceThree = of('Goodbye').pipe(delay(3000));
const sourceFour = of('World!').pipe(delay(4000));

//wait until all observables have emitted a value then emit all as an array
const example = combineLatest(
sourceOne.pipe(startWith(null)),
sourceTwo.pipe(startWith(null)),
sourceThree.pipe(startWith(null)),
sourceFour.pipe(startWith(null))
)
.pipe(skip(1));

//output:
//["Hello", null, null, null]
//["Hello", "World!", null null]
//["Hello", "World!", "Goodbye", null]
//["Hello", "World!", "Goodbye", "World!"]
//Complete
const subscribe = example.subscribe(val => console.log(val), null, () => console.log('Complete'));

这是一个 StackBlitz尝试一下。

关于angular - 用于可观察链接的仓促 forkjoin 替代 rxjs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59650312/

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