Javascript RxJS bufferWithCount()未暂停超时
我正试图控制缓慢用户的流入。在NodeJS中尝试了以下内容Javascript RxJS bufferWithCount()未暂停超时,javascript,node.js,rxjs,reactive-extensions-js,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('----------\nFastS
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();
当我启动时,我希望慢速订阅服务器每次在收到下一批数据之前暂停5秒
但事实并非如此。在最初的5秒延迟后,所有数据以2个批次的方式被淹没到slowSubscriber
控制流入的正确方法是什么,以便慢子系统可以花时间(最好是快子系统可以等待慢子系统完成)?它没有暂停,因为
setTimeout
不会阻止执行,它只是安排工作在稍后时间完成,即2秒后,然后,更多的数据进入,它被安排在2秒钟+一些微小的增量从现在开始。结果是快速和慢速订阅者将同时完成,但慢速订阅者的结果要到2秒后才能显示出来
如果您的实际用例中的慢速订阅者实际上是非阻塞的,那么您有两个控制事件流的选项,或者您需要控制来自消息源的流,无论在哪里。或者您需要使用一个背压操作符,如controlled()
它不会暂停,因为
setTimeout
不会阻止执行,它只是将工作安排在稍后的时间完成,即2秒后,会有更多数据进入,并安排2秒+从现在开始的一些微小增量。结果是快速和慢速订阅者将同时完成,但慢速订阅者的结果要到2秒后才能显示出来
如果您的实际用例中的慢速订阅者实际上是非阻塞的,那么您有两个控制事件流的选项,或者您需要控制来自消息源的流,无论在哪里。或者您需要使用一个背压操作符,如controlled()
它不会暂停,因为
setTimeout
不会阻止执行,它只是将工作安排在稍后的时间完成,即2秒后,会有更多数据进入,并安排2秒+从现在开始的一些微小增量。结果是快速和慢速订阅者将同时完成,但慢速订阅者的结果要到2秒后才能显示出来
如果您的实际用例中的慢速订阅者实际上是非阻塞的,那么您有两个控制事件流的选项,或者您需要控制来自消息源的流,无论在哪里。或者您需要使用一个背压操作符,如controlled()
它不会暂停,因为
setTimeout
不会阻止执行,它只是将工作安排在稍后的时间完成,即2秒后,会有更多数据进入,并安排2秒+从现在开始的一些微小增量。结果是快速和慢速订阅者将同时完成,但慢速订阅者的结果要到2秒后才能显示出来
如果您的实际用例中的慢速订阅者实际上是非阻塞的,那么您有两个控制事件流的选项,或者您需要控制来自消息源的流,无论在哪里。或者您需要使用一个背压操作符,如controlled()
非常感谢@paulpdaniels这个解释很有道理。关于
conroller.request
,如果我们不知道哪个订户速度慢(比如,多个订户使用ajax调用),如何同步所有子服务器以等待完成?(如果范围不同或答案较长,我可以提出另一个问题)。谢谢你的回答。这非常有用。@GopalakrishnaPalem如果您的订阅者是异步的,您需要使用类似于concatMap
的东西来执行异步工作,而不会“被淹没”:comJson.concatMap(函数(x){return Rx.Observable.timer(5000).map(函数(t){console.log(“slowsub called”,x);});}.subscribe()代码>非常感谢@paulpdaniels这个解释很有道理。关于conroller.request
,如果我们不知道哪个订户速度慢(比如,多个订户使用ajax调用),如何同步所有子服务器以等待完成?(如果范围不同或答案较长,我可以提出另一个问题)。谢谢你的回答。这非常有用。@GopalakrishnaPalem如果您的订阅者是异步的,您需要使用类似于concatMap
的东西来执行异步工作,而不会“被淹没”:comJson.concatMap(函数(x){return Rx.Observable.timer(5000).map(函数(t){console.log(“slowsub called”,x);});}.subscribe()代码>非常感谢@paulpdaniels这个解释很有道理。关于conroller.request
,如果我们不知道哪个订户速度慢(比如,多个订户使用ajax调用),如何同步所有子服务器以等待完成?(如果范围不同或答案较长,我可以提出另一个问题)。谢谢你的回答。这非常有用。@GopalakrishnaPalem如果您的订阅者是异步的,您需要使用类似于concatMap
的东西来执行异步工作,而不会“被淹没”:comJson.concatMap(函数(x){return Rx.Observable.timer(5000).map(函数(t){console.log(“slowsub called”,x);});}.subscribe()代码>非常感谢@paulpdaniels这个解释很有道理。关于conroller.request
,如果我们不知道哪个订户速度慢(比如,多个订户使用ajax调用),如何同步所有子服务器以等待完成?(如果范围不同或答案较长,我可以提出另一个问题)。谢谢你的回答。这是非常有用的。@GopalakrishnaPal
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);