RxJS v5可暂停观测间隔

RxJS v5可暂停观测间隔,rxjs,rxjs5,Rxjs,Rxjs5,在RxJS v5中没有实现pausable操作符的情况下,有没有更好的方法来创建可暂停的间隔?下面的代码起作用,但它是通过跟踪最后发出的值作为偏移量来实现的。看来应该有更好的办法 const source = Rx.Observable.interval(100).share() const offset = new Rx.BehaviorSubject(0) let subscription; let currentValue; function start() { subs

在RxJS v5中没有实现
pausable
操作符的情况下,有没有更好的方法来创建可暂停的间隔?下面的代码起作用,但它是通过跟踪最后发出的值作为偏移量来实现的。看来应该有更好的办法

const source = Rx.Observable.interval(100).share()
const offset = new Rx.BehaviorSubject(0)
let subscription;
let currentValue;

function start() {    
    subscription = source
        .subscribe(i => {
            currentValue = i + offset.value
      })
}



function pause() {
    source.take(1).subscribe(i => offset.next(i + offset.value))
    subscription.unsubscribe()
}
share()。
refCount()。由于您正在从源代码处取消订阅,它将自行清理,然后在
subscribe
d再次订阅时重新启动。将
publish()
connect()
一起使用。代码如下:

const source = Observable.interval(100).publish();
source.connect();

// Start with false, change to true after 200ms, then false again
// after another 200ms
const pauser = Observable.timer(200)
  .mapTo(true)
  .concat(Observable.timer(200).mapTo(false))
  .startWith(false);

const pausable = pauser
  .switchMap(paused => (paused ? Observable.never() : source))
  .take(10);

pausable.subscribe(x => console.log(x));

请参阅此jsbin以获取运行示例:。

没有通用的方法来实现这一点。这取决于你暂停的确切含义以及你暂停的内容。(您是否希望停止发射,然后重新开始,您是否缓冲和排放,或者您是否需要有效地向上游添加延迟,但以其他方式及时保持上游值的分布?)

我有一种有效的方法,当上游是一个定时器时,就像你的例子中那样。这就是我自己问题的答案

这种方法的最大优点是在时间上保留了源的值分布,但只是增加了延迟

对于更一般的情况:

  • 对于冷观测:
    从不
    和上游之间切换
    。暂停时,从上游取消订阅
    skip
    您看到的,然后
    切换到
    skip
    ed流。取消暂停时,您必须保持已发出值的计数,以便下次有人取消暂停时可以跳过该数值。你只需要记住你以前见过多少次。然而,每一次不暂停都会导致冷观测从一开始就重演。在一般情况下,这可能是非常低效的。代码看起来像这样<代码>暂停器
    这里有一个主题,您可以将其设置为true或false以暂停上游

    function pausableCold(pauser, upstream) {
        var seen = 0;
        return pauser.switch(paused => {
            if (paused) {
                return Observable.never();
            }
            else {
                return upstream.skip(seen).do(() => seen++);
            }
        });
    }
    
  • 对于热观测或冷观测,可以使用缓冲<代码>缓冲区
  • 暂停时,然后在未暂停时排放并浓缩到热上游。(这会保留所有值,但不会保留它们在时间上的分布。此外,如果可能是冷的,您应该使用
    publish
    向上游加热。)

  • 最有效的方法并不是真正的Rx的一部分。您真正想要的是告诉源停止发射,然后重新开始。您这样做的方式非常特定于源是什么以及源是如何生成值的


  • @cartant这很有帮助,但是源间隔在暂停时仍然会重置,所以就我所知,跟踪偏移值仍然是必要的。