缓冲来自条形码扫描仪的击键
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
我需要从条形码扫描仪获取输入,它的工作原理与键盘完全一样,只是 "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