缓冲来自条形码扫描仪的击键

Buffering keystrokes from a barcode scanner

我需要从条形码扫描仪获取输入,它的工作原理与键盘完全一样,只是 "types" 快了很多。 没有定界符,没有行尾。几乎没有办法比较标量值 - 用户输入的任何内容看起来都可能与条形码完全一样。

我想这在 Rx 中是可行的,因为条形码扫描比任何用户输入都快得多。

如何从 document.keypress 事件创建一个 Observable 来区分用户输入和条码扫描器的输入? 我猜它应该以某种方式 buffer/window 值,只要有 "burst" 的按键然后之间有停顿。

这样做,仍然没有帮助:

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

它每隔一秒半抓取一次输入的内容。 你们能帮我解决这个问题吗?

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

在您的代码的当前版本中,您还可以使用 timeInterval 来避免自己操作时间戳:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeinterval.md, http://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