Javascript 如何创建一个RxJS缓冲区,对NodeJ中的元素进行分组,但不依赖于永久运行间隔?
我使用NodeJS中的Javascript 如何创建一个RxJS缓冲区,对NodeJ中的元素进行分组,但不依赖于永久运行间隔?,javascript,node.js,promise,reactive-programming,rxjs,Javascript,Node.js,Promise,Reactive Programming,Rxjs,我使用NodeJS中的Rx.Observable.fromEvent从应用程序捕获事件。 这些将使用request()发送到另一台服务器。 为了避免高网络负载,我需要在发送请求之间的给定超时处缓冲这些事件 问题 使用bufferWithTime(200)将保持节点进程运行,我不知道应用程序何时完成关闭流 有没有办法使用Rx缓冲区来表示: 当按下元件1时,设置计时器 当元素2和3在计时器到期之前到达时,将它们推送到数组[1,2,3](缓冲区) 当计时器过期时,将[1,2,3]数组沿管道发送 如果元
Rx.Observable.fromEvent
从应用程序捕获事件。
这些将使用request()发送到另一台服务器。
为了避免高网络负载,我需要在发送请求之间的给定超时处缓冲这些事件
问题
使用bufferWithTime(200)
将保持节点进程运行,我不知道应用程序何时完成关闭流
有没有办法使用Rx缓冲区来表示:
Rx.Observable
.fromEvent(eventEmitter, 'log')
.bufferWithTime(200) // this is the issue
.map(addEventsToRequestOption)
.map(request)
.flatMap(Promise.resolve)
.subscribe(log('Response received'))
您可能需要拆分流并使用第二部分来触发第一部分
var source = Rx.Observable.fromEvent(eventEmitter, 'log');
var closer = source.flatMapFirst(Rx.Observable.timer(2000));
source
.buffer(closer)
.map(addEventsToRequestOption)
.flatMap(function(x) { Promise.resolve(request(x)); })
//I assume this log method returns a function?
.subscribe(log('Response received'));
source.flatMapFirst(Rx.Observable.timer(2000))
是这里的重要一行。它创建一个可观察的对象,该对象生成一个计时器,该计时器将在2000毫秒后触发。当第一个事件出现时,它将启动计时器<只要计时器正在运行,code>flatMapFirst将忽略后续事件。当计时器最终发出时,它将触发缓冲区发出其当前缓冲区并再次启动
使用
delay
运算符,请参见具有可观察边界的buffer
上的建议实现:
function emits(who){
return function (x) { console.log([who, "emits"].join(" ") + " " + x + " click(s)");};
}
var source = Rx.Observable.fromEvent(document.body, 'click');
console.log("running");
var delayedSource$ = source.delay(1200);
var buffered$ = source
.buffer(function () { return delayedSource$;}).map(function(clickBuffer){return clickBuffer.length;})
buffered$.subscribe(emits("buffer"));
请点击这里:
可能是
缓冲
和超时
的组合?例如,将您的超时时间
放在末尾,如果没有事件进入缓冲区,则在该时间之后您希望关闭流。关于,您的方法链在。fromEvent()
之后从可观察的方法切换到可观察的实例方法。你确定这是允许的吗?@user3743222我可能会尝试,但如果我不知道何时会收到事件,过早关闭流可能意味着错过一些延迟事件。关闭的流被推送的新事件重新打开?@Roamer-1888好吧,我假设我需要订阅一个可观察的实例并从中过滤事件。是不是我在如何使用Rx时遗漏了什么?@Roamer-1888是的,这也是我所理解的,你“实例化一个可观察的对象”,然后“向流中添加动作”,最后调用Bn()来捕获结果。我也在学习这一点,所以谢谢你这样解释,我对事物如何运作有了新的见解!首先竖起大拇指看平面图!非常有用的知道,谢谢!实现是可行的,但不幸的是,我还需要捕获时间间隔之间的事件,而flatMapFirst将删除它们。