RxJS (5.0rc4):暂停和恢复间隔计时器

RxJS (5.0rc4): Pause and resume an interval timer

我正在使用 Rx 来保持动画时钟。每个动画帧,它将一个间隔刻度映射到该刻度的新值。

假设我想暂停动画。最自然的方法是以某种方式暂停时钟 rx,然后在稍后恢复它。

取消订阅然后重新订阅不是一个自然的选择,因为这个动画时钟是一个冷的可观察对象。我不想在他们恢复时重新启动动画。如果我采用变通方法,我将不得不生成一个新的简历 rx,这会使所有公开的 API 变得非常复杂。

背压方法似乎没有希望:

pause 不起作用,因为我想从我离开的地方继续,而不是向前跳。换句话说,我不想在它关闭时打勾。

pausableBuffered 不起作用,因为在恢复时,它会尽可能快地耗尽所有累积的刻度。

使用某种虚拟时间调度程序来完全停止时间然后恢复正常时间是可能的(?)

我正在使用 RxJS 5.0rc4,但我也不知道如何在 RxJS 4 上执行此操作。任何版本的任何建议将不胜感激。

pauser 流上使用 switchMap 在原始来源和 Observable.never 之间进行选择。如果你不想让定时器提前跳转,那就自己管理吧(使用下面的x变量)。

function pausableInterval(ms, pauser) {
    let x = 0;
    const source = IntervalObservable.create(ms);
 
    return pauser.switchMap(
        paused => paused ? 
        Observable.never() : 
        source.map(() => x++)
    );
}

pauser 流应该发出布尔值。

未测试。

使用 torazaburo 的想法让我完成了 95%。最后一步是我需要 x 闭包对于每个订阅都是唯一的。 Observable.create 是我为每个订阅创建闭包所需要的。

pausableInterval(paused: Rx.Observable<boolean>): Rx.Observable<number> {
    return Rx.Observable.create((obs: Rx.Observer<number>) => {
        let i = 0;
        let ticker = Rx.Observable.interval(1000 / this.fps).map(() => i++)

        let p = paused.switchMap(paused => paused ? Rx.Observable.never() : ticker);
        return p.subscribe(val => obs.next(val), err => obs.error(err), () => obs.complete());
     });
 }