我需要从条形码扫描仪获取输入,它的工作原理与键盘完全相同,只是它的“输入”速度要快得多。 没有分隔符,没有行结束符。几乎没有办法比较标量值 - 用户输入的任何内容都可能看起来与条形码完全相同。
我想 Rx 是可能的,因为条形码扫描速度比任何用户输入的速度都要快。
如何从 document.keypress
事件创建一个 Observable 来区分用户输入和条形码扫描仪的输入?
我猜想每当按键“突发”然后暂停时,它应该以某种方式缓冲/窗口值。
这样做,仍然没有帮助:
Rx.Observable.fromEvent(document, 'keypress')
.bufferWithTime(1500)
.filter((x)=> _.isNotEmpty(x) && x.length > 5)
它只是每隔半秒抓取一次输入的内容。 你们能帮我解决这个问题吗?
最佳答案
在当前版本的代码中,您还可以使用 timeInterval
来避免自己操作时间戳:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeinterval.md , http://reactivex.io/documentation/operators/timeinterval.html
但是,在我看来,这里更好的想法实际上是使用带有关闭选择器的 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
关于javascript - 缓冲条形码扫描仪的击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33816893/