我有一段代码想定期执行,直到所有订户都退订为止。

// 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/

10-13 08:14
查看更多