我正在尝试控制慢速订阅者的流入量。尝试在NodeJS中进行以下操作
var xmlNodeStream = Rx.Observable.from([1,2,3,4,5,6,7,8,9,10,11]);
var commJson = xmlNodeStream.bufferWithCount(2).publish();
var FastSubscriber = commJson.subscribe(
function (x) { console.log('----------\nFastSub: onNext: %s', x); },
function (e) { console.log('FastSub: onError: %s', e); },
function () { console.log('FastSub: onCompleted'); });
var slowSubscriber = commJson.subscribe(function (x) {
setTimeout(function () { console.log("============\nSlowsub called: ", x); }, 5000);
});
commJson.connect();
当我run the above code时,我希望慢速订阅者在收到下一个数据批处理之前每次暂停5秒。
但事实并非如此。在最初的5秒延迟之后,所有数据都会以2个批次泛滥到slowSubscriber
。
控制流入的正确方法是什么,以便缓慢的子纤维可以花费他们的时间(最好是快速的可以等待慢速的完成)?
答案 0 :(得分:3)
它没有暂停,因为setTimeout
不会阻止执行它只是安排工作在以后完成,即2秒后,然后更多的数据进入并且它被安排为2秒+一些小从现在起三角洲。结果是快速和慢速用户将同时完成,但慢用户的结果将在2秒后才会显示。
如果您实际使用案例中的慢用户实际上是非阻塞的,那么您有两个控制事件流的选项,您需要控制来自消息来源的流量,无论哪种情况。或者您需要使用其中一个背压操作符,例如controlled()
var xmlNodeStream = Rx.Observable.from([1,2,3,4,5,6,7,8,9,10,11]);
var controller = xmlNodeStream.bufferWithCount(2).controlled();
var commJson = controller.publish().refCount();
var FastSubscriber = commJson.subscribe(
function (x) { console.log('----------\nFastSub: onNext: %s', x); },
function (e) { console.log('FastSub: onError: %s', e); },
function () { console.log('FastSub: onCompleted'); });
var slowSubscriber = commJson.subscribe(function (x) {
setTimeout(function () {
console.log("============\nSlowsub called: ", x);
controller.request(1);
}, 5000);
});
commJson.request(1);