我有一个observable,它从服务器包装一个socket.io事件流(称之为source
)。来自socket.io的每条消息都在observable上发出。这个observable被过滤并根据socket.io消息的内容映射到多个订阅。
例如:
var filtered = source.filter(function(msg) { return msg.name === 'EventName' });
filtered.subscribe(function handeEventName(msg) { /* do something with msg */ });
有时这些订阅会在我的应用中触发长动画。我希望在发生这种情况时暂停源可观察,缓冲新事件直到播放动画,然后恢复可观察的。
我使用pausableBuffered
var pausable = source.pausableBuffered();
var filtered = pausable.filter(function(msg) { return msg.name === 'EventName' });
filtered.subscribe(function handeEventName(msg) {
pausable.pause();
/**
* do something async, like animation, then when done call
* pausable.resume();
*/
});
到目前为止一切顺利。
但是,我们假设当observable暂停时,会缓冲五条消息。第三条消息是需要再次暂停流的消息。它有一个订阅设置这样做。但是,一旦源observable未被暂停,它立即清空所有五个事件的缓冲区,所有这些事件都被处理并传递给所有五个订阅,此时第三个消息的订阅最终暂停原始流。
我理解为什么会这样,但我真正希望发生的是:
似乎我使用pausableBuffered
的每种方式都会将整个缓冲区转储到所有订阅中。我怎样才能实现我的目标?
答案 0 :(得分:2)
您可以尝试controlled
观察。给你几乎完全控制。
例如:
var source = Rx.Observable.interval(300).take(10);
var controlled = source.controlled();
var sourceSub = source.subscribe(
function (x) {
console.log('Next source: ' + x.toString());
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
var controlledSub = controlled.subscribe(
function (x) {
console.log('Next controlled: ' + x.toString());
if (x === 3) {
setTimeout(function(){
controlled.request(1)
}, 2000)
} else {
controlled.request(1);
}
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
controlled.request(1);