我有一段代码想定期执行,直到所有订户都退订为止。
// 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>
但是,当调用两个observable时,
doSomething
函数被调用了两次。这是实际输出: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 - 可观察到与多个订户执行一次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50353514/