gpt4 book ai didi

javascript - 一个 Observable,多个订阅者,不同的情况,使用 rxjs5 的不同 share() 行为

转载 作者:太空狗 更新时间:2023-10-29 17:55:15 26 4
gpt4 key购买 nike

当两个订阅者订阅一个可观察对象时:

  let s = Observable.interval(1000).take(2).do(x => console.log('hey'));
s.subscribe(n => console.log('subscriber 1 = ' + n));
s.subscribe(n => console.log('subscriber 2 = ' + n));

控制台记录以下内容:

'hey' 'subscriber 1 = 0' 'hey' 'subscriber 2 = 0' 'hey' 'subscriber 1 = 1' 'hey' 'subscriber 2 = 1'

使用.share():

let s = Observable.interval(1000).take(2).do(x => console.log('hey')).share();
s.subscribe(n => console.log('subscriber 1 = ' + n));
s.subscribe(n => console.log('subscriber 2 = ' + n));

控制台日志:

'hey' 'subscriber 1 = 0' 'subscriber 2 = 1' 'hey' 'subscriber 1 = 0' 'subscriber 2 = 1'

因此,我设法将相同的数据共享给超过 1 个订阅者。执行以下测试:

let s = Observable
.from([-1, 0, 1, 2, 3])
.filter(v => v > 0)
.do(v => console.log('from', v));

s.filter(v => v % 3 === 0)
.subscribe(v => console.log('---0---', v));
s.filter(v => v % 3 === 1)
.subscribe(v => console.log('---1---', v));
s.filter(v => v % 3 === 2)
.subscribe(v => console.log('---2---', v));

日志:

'from', 1 'from', 2 'from', 3 '---0---',3 'from', 1 '---1---',1 'from', 2 'from', 3 'from', 1 'from', 2 '---2---', 2 'from', 3

再一次,我使用了share():

 let s = Observable
.from([-1, 0, 1, 2, 3])
.filter(v => v > 0)
.do(v => console.log('from', v))
.share();

s.filter(v => v % 3 === 0)
.subscribe(v => console.log('---0---', v));
s.filter(v => v % 3 === 1)
.subscribe(v => console.log('---1---', v));
s.filter(v => v % 3 === 2)
.subscribe(v => console.log('---2---', v));
});

尽管我使用了 share(),但从数据中记录的方式与之前没有 share() 的尝试完全相同(from 1 from 2 from 3每次记录 3 次,每个订阅者 1 次)。

那么,这些示例中的 observables 之间有什么区别?

第二种情况如何共享数据?

最佳答案

使用 Rxjs 4 你应该只看到一次 from 1 from 2 from 3。但是,您将只有一个过滤器日志记录。 Rx.Observable.from(array) 正在同步发出其序列。因此,当 s.filter(v => v % 3 === 0).subscribe(v => console.log('---0---', v));被执行,你的 s observable 已经完成。你可以在这里看到:[jsfiddle] .输出是:

from 1
from 2
from 3
---0--- 3

在 Rxjs 5 中,share 运算符现在会在源结束并且有新订阅者订阅时重新启动源。在第二个过滤器中,s 被重新启动。所以你经历了三遍源序列制作过程。

为了让您相信这一点,请将您的同步序列转换为异步序列:jsfiddle .你现在应该得到,这是你所期望的:

from 1
---1--- 1
from 2
---2--- 2
from 3
---0--- 3

奇怪的是,migration guide 中没有记录这一点.但是,您可以找到一些有关更改动机的信息 herehere (简而言之,您得到了改进的 repeatretry 语义)。

也就是说,您仍然可以使用 publish().refCount() 来使用 Rxjs 4 share 运算符。但如前所述,您的第二个过滤器将看不到任何数据,因为源已经完成。看这里:jsfiddle .

关于javascript - 一个 Observable,多个订阅者,不同的情况,使用 rxjs5 的不同 share() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37816907/

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