缓冲条形码扫描器的击键

时间:2015-11-20 00:23:57

标签: javascript reactive-programming rxjs

我需要从条形码扫描仪中获取输入,这与键盘完全一样,只有#34;类型"快得多。 没有分隔符,没有行结尾。事实上,无法比较标量值 - 用户输入的任何内容可能看起来与条形码完全相同。

我想这对Rx来说是可能的,因为条形码扫描比任何用户都可以输入的速度快得多。

如何从document.keypress事件中创建一个可区分用户输入和条形码扫描器的Observable? 我猜它应该以某种方式缓冲/窗口值,只要有"爆发"按键然后暂停之间。

这样做,仍然没有帮助:

Rx.Observable.fromEvent(document, 'keypress')
                .bufferWithTime(1500)
                .filter((x)=> _.isNotEmpty(x) && x.length > 5)

它只抓住每一秒钟输入的内容。 你们能帮助我绕过这件事吗?

2 个答案:

答案 0 :(得分:1)

我认为您需要的是timestamp运算符。然后,您可以过滤按键的记录速度。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timestamp.md

答案 1 :(得分:1)

在当前版本的代码中,您还可以使用timeInterval来避免自行操纵时间戳:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeinterval.mdhttp://reactivex.io/documentation/operators/timeinterval.html

然而,更好的想法IMO在这里真的是使用buffer运算符和关闭选择器。结束选择器可以使用debounce运算符。参看https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md

基本上,当在Xms之后没有发出更多的键时(例如source.buffer(function(){return source.debounce(Xms)})),你会关闭缓冲区。所以你会有一个可观察的数组(缓冲区)。并且您应该仔细选择去抖动超时,以便在用户按键时阵列大小为1,并且在扫描仪输入时为> 1。例如,我的正常打字速度是每分钟247次按键。

使用关闭选择器的buffer运算符的示例:Smarter buffers