gpt4 book ai didi

javascript - Observable 对多个订阅者执行一次

转载 作者:数据小太阳 更新时间:2023-10-29 06:14:17 26 4
gpt4 key购买 nike

我有一段代码要定期执行,直到所有订阅者都取消订阅。

// This function shall be called *once* per tick,
// no matter the quantity of subscriber.
function doSomething(val) {
console.log("doing something");
return val;
}

observable = Rx.Observable.timer(0, 1000).map(val => doSomething(val));

const first = observable.subscribe(val => console.log("first:", val));
const second = observable.subscribe(val => console.log("second:", val));

// After 1.5 seconds, stop first.
Rx.Observable.timer(1500).subscribe(_ => first.unsubscribe());
// After 2.5 seconds, stop second.
Rx.Observable.timer(2500).subscribe(_ => second.unsubscribe());

JSFiddle

我预期的输出是这样的:

doing something
first: 0
second: 0
doing something
first: 1
second: 1
doing something
second: 2
<nothing more>

然而,doSomething 函数在调用两个 observable 时被调用了两次。这是实际输出:

doing something
first: 0
doing something
second: 0
doing something
first: 1
doing something
second: 1
doing something
second: 2
<nothing more>

我是否犯了设计错误?有办法做到这一点吗?

最佳答案

您看到的行为是正确的。 interval 返回的 observable 是冷的。也就是说,在观察者订阅之前不会创建计时器,当有人订阅时,创建的计时器专门用于该订阅。

可以使用 share 运算符实现您期望的行为:

observable = Rx.Observable
.timer(0, 1000)
.map(val => doSomething(val))
.share();

share 运算符引用计数订阅并将可观察到的源多播给多个订阅者 - 因此只有一个间隔/计时器,在两个订阅者之间共享。

有关更多信息,您可能会找到 this article有用。

关于javascript - Observable 对多个订阅者执行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50353514/

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