Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何创建一个RxJS缓冲区,对NodeJ中的元素进行分组,但不依赖于永久运行间隔?_Javascript_Node.js_Promise_Reactive Programming_Rxjs - Fatal编程技术网

Javascript 如何创建一个RxJS缓冲区,对NodeJ中的元素进行分组,但不依赖于永久运行间隔?

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]数组沿管道发送 如果元

我使用NodeJS中的
Rx.Observable.fromEvent
从应用程序捕获事件。 这些将使用request()发送到另一台服务器。 为了避免高网络负载,我需要在发送请求之间的给定超时处缓冲这些事件

问题

使用
bufferWithTime(200)
将保持节点进程运行,我不知道应用程序何时完成关闭流

有没有办法使用Rx缓冲区来表示:

  • 当按下元件1时,设置计时器
  • 当元素2和3在计时器到期之前到达时,将它们推送到数组[1,2,3](缓冲区)
  • 当计时器过期时,将[1,2,3]数组沿管道发送
  • 如果元素4在计时器过期后出现,则设置一个新计时器并重新启动
  • 如果未按下任何元素,则不会启动使进程退出的计时器

    我最初的做法是:

    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将删除它们。