2015-04-21 3 views
3

Как действительно приостановить наблюдаемый rxjs?Как приостановить наблюдаемый

У меня есть следующий код:

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, а последние подписаться

, но после одного второго перерыва я получил два последних подписаться сообщение немедленно. Кажется, я могу приостановить наблюдаемые только один раз.

Для тех, кому интересно, чего я хочу достичь: хочу иметь очередь событий, и я хочу получить следующее событие, если вызван какой-то обратный вызов для предыдущего (событие завершено. это просто простой setTimeout)

ответ

2

pausableBuffered сохраняет буфер при паузе и истощает буфер при вызове резюме. То, что вы хотите, больше похоже на контролируемый наблюдаемый, где вы говорите 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')

Смежные вопросы