gpt4 book ai didi

javascript - Rxjs 摆脱双重订阅

转载 作者:行者123 更新时间:2023-12-02 14:50:43 26 4
gpt4 key购买 nike

var sourceInit = Rx.Observable.timer(0, 1000)
.do(x => console.log('timer', x))

let source = sourceInit.map(x => x*10)

source.subscribe(x => {
console.log('x', x)
})

source.subscribe(x => {
console.log('x2', x)
})

我得到的输出:

timer 0
x 0
timer 0
x2 0
timer 1
x 10
timer 1
x2 10
timer 2
x2 20
timer 2

我只需要对计时器和输出进行单一订阅,如下所示:

timer 0
x 0
x2 0
timer 1
x 10
x2 10
timer 2
x 20
x2 20

解决这个问题的正确方法应该是什么?

我通过使用主题的方法得到了:

var sourceInit = Rx.Observable.timer(0, 1000)
.do(x => console.log('timer', x))

var source = new Rx.Subject();
sourceInit.subscribe(source)

source.subscribe(x => {
console.log('x', x)
})

source.subscribe(x => {
console.log('x2', x)
})

它正确且只有一个吗?

最佳答案

您遇到的双重订阅问题与 Rx 可观察量的冷与热性质有关。默认情况下,Observables 是冷的,所以任何时候你订阅它们,你都从头开始。您可以在这里找到所发生情况的详细说明:Hot and Cold observables : are there 'hot' and 'cold' operators? 。这是针对 Rxjs V4 设计的,但它也应该适用于 Rxjs V5。

一个常见的解决方案是让您想要订阅多次的可观察对象变得“热门”(主题很热门,因此您的解决方案有效)。也就是说,这里不需要使用主题。要使冷源变为热源,您可以使用一组运算符,share 更为常见:

var sourceInit$ = Rx.Observable.timer(0, 1000)
.share()
.do(x => console.log('timer', x))

let source$ = sourceInit$.map(x => x*10)

source$.subscribe(x => {
console.log('x', x)
})

source$.subscribe(x => {
console.log('x2', x)
})

关于javascript - Rxjs 摆脱双重订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36204332/

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