RxJS -如何手动发出缓冲区/查看缓冲区中的元素

RxJS - how to emit buffer manually / view elements in buffer

本文关键字:缓冲区 元素 RxJS 何手动      更新时间:2023-09-26

我想做的是获得键盘事件的数量,如果这些事件之间的时间少于提供。也许这不是正确的方法,这就是为什么我还在原地。

所以首先我做了一个简单的流和过滤器来捕捉我感兴趣的每一个事件。接下来,我制作了第二个流,并将事件分组成对,这样我可以测量时间戳。似乎它工作得很好,但只有偶数事件-所以在这段时间后,我需要检查是否有东西在缓冲区中,如果它在那里,我应该把它添加到我的字符串。

代码:

const timeToWait : number = 500;
const keyDigitsUp$ = Observable.fromEvent(document, "keyup")
  .filter((event:any) => {return ((event.keyCode>=48 && event.keyCode <=57) ||
(event.keyCode>=96 && event.keyCode <=106))});
let bufferedEvents = Observable.from(keyDigitsUp$).bufferCount(2);
let numbers : string = "";
bufferedEvents.subscribe((eventArray) => {
    if (eventArray[1].timeStamp - eventArray[0].timeStamp <= timeToWait)
    {
        numbers+=eventArray[0].key + eventArray[1].key;
    }
    else
    {
        numbers="";
    }
});

有没有办法让这个概念起作用?或者也许有更好的方法,我错过了。我还制作了其他概念,但它们产生了类似的结果。我当然可以使它以非响应式方式工作,并订阅主流-保存上一个事件,如果存在,然后将其与下一个进行比较等等,但由于我正在尝试学习响应式编程,我想使它尽可能多的响应。

你工作太辛苦了:-)

const timeout = 500;
keyDigitsUp$
  .buffer(keyDigitsUp$.debounce(timeout))
  .map(events => (events.length <= 1 ? '' : events.map(event => event.key).join(',')))
  .subscribe(v => console.log('events for timeout ' + timeout + ' msec: '+ v));

查看一个工作的jsbin。

它的工作方式是,它关闭缓冲区(即产生一个块)只有当你的任何键没有按超时(500在这种情况下)毫秒。

我不知道你想用关键代码做什么,所以我只是用逗号分隔符连接它们。

rxjs 5的语法可能略有不同。