可观察到与多个订户执行一次

时髦的

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

// 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当调用两个可观察对象时,该函数被调用两次。这是实际输出:

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

我在做设计错误吗?有没有办法做到这一点?

卡坦

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

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

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

share操作者引用计数订阅和组播源可观察到多个订户-所以会有只有单个间隔/定时器,在两个用户之间共享。

有关更多信息,您可能会发现本文很有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章