RxJS bufferWithCount()没有暂停超时

时间:2015-08-19 13:35:23

标签: javascript node.js rxjs reactive-extensions-js

我正在尝试控制慢速订阅者的流入量。尝试在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

控制流入的正确方法是什么,以便缓慢的子纤维可以花费他们的时间(最好是快速的可以等待慢速的完成)?

1 个答案:

答案 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);