如何暂停一个可观察的

时间:2015-04-21 16:48:25

标签: javascript rxjs

如何真正暂停rxjs observable?

我有以下代码:

var pauser = new Rx.Subject();
var animation = new Rx.Subject();
var source = animation.pausableBuffered(pauser);

source
.subscribe(function(frame) {
    console.log('subscribe', frame);
    setTimeout(function() {
        source.resume();
    }, frame.duration);
    source.pause();
});

pauser.onNext(true);
console.log('start');
animation.onNext({ duration: 1000 });
animation.onNext({ duration: 2000 });
animation.onNext({ duration: 2000 });

http://jsfiddle.net/bbvarga/8yvLhjhe/

我希望控制台中的开始消息在订阅之后,而不是1s中断,而不是一个订阅消息,而不是2s break ,以及最后一个订阅

但是在一秒钟休息之后,我立刻得到了最后两个订阅消息。好像我只能暂停观察一次。

对于那些对我想要实现的目标感兴趣的人:我想拥有一个事件队列,并且我希望接收下一个事件,如果为前一个事件调用了一些回调(事件已完成。现在它& #39;只是一个简单的setTimeout)

1 个答案:

答案 0 :(得分:2)

pausableBuffered在暂停时保持缓冲区,并在调用resume时调用缓冲区。你想要什么看起来更像是一个受控制的观察者,你说source.request(1)

有关详细信息,请参阅the rxjs docs on backpressure



var animation = new Rx.Subject();
var source = animation.controlled();

source
.subscribe(function(frame) {
    console.log('new event', frame);
    setTimeout(function() {
        console.log('after timeout', frame);
        source.request(1);
    }, frame.duration);
});

source.request(1);

animation.onNext({ duration: 1000 });
console.log('animation.onNext 1');
animation.onNext({ duration: 2000 });
console.log('animation.onNext 2');
animation.onNext({ duration: 3000 });
console.log('animation.onNext 3')