RxJS -如何手动发出缓冲区/查看缓冲区中的元素
RxJS - how to emit buffer manually / view elements in buffer
我想做的是获得键盘事件的数量,如果这些事件之间的时间少于提供。也许这不是正确的方法,这就是为什么我还在原地。
所以首先我做了一个简单的流和过滤器来捕捉我感兴趣的每一个事件。接下来,我制作了第二个流,并将事件分组成对,这样我可以测量时间戳。似乎它工作得很好,但只有偶数事件-所以在这段时间后,我需要检查是否有东西在缓冲区中,如果它在那里,我应该把它添加到我的字符串。
代码: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在这种情况下)毫秒。
我不知道你想用关键代码做什么,所以我只是用逗号分隔符连接它们。
相关文章:
- CKEditor Widget-阻止编辑可编辑元素本身
- 如何设置html元素填充的动画
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 使用clickToggle并在单击另一个元素时关闭元素
- 单击时将焦点更改为元素
- 表追加而不附加最后一个元素
- 如何在jQuery中获取元素的形式
- 我可以获得相对于被点击元素的确切点击位置吗
- 在函数中添加数组元素的数值
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 将视口底部滚动到元素底部
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 如何使用jquery处理php循环通过元素
- Ckeditor-plugin:插入虚假元素add不情愿<p>标签前后
- 如何创建一个RxJS缓冲区,将NodeJS中的元素分组,但不依赖于永远运行的间隔
- 音频数组缓冲区到音频元素
- RxJS -如何手动发出缓冲区/查看缓冲区中的元素
- 使用canvas元素作为图像的缓冲区更有利,还是使用img元素作为缓冲区更有益