从条形码扫描器中缓冲击键

问题描述:

我需要从条形码扫描器获取输入,其工作方式与键盘完全相同,只是它“键入”的速度要快得多。 没有分隔符,没有行结束符。几乎没有办法比较标量值 - 用户输入的内容可能完全是条形码。从条形码扫描器中缓冲击键

我想这可能与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.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

+0

对不起,我仍然在努力理解如何使用'与关闭选择.buffer'。你能否用代码片段来证明这一点。我会很感激。 – Agzam

+0

?我把你自己已经问过关于类似主题的问题(智慧缓冲区)联系起来。将代码放在那里,用'source.buffer(function(){return source.debounce(Xms)})'替换相应的行。究竟是什么,你仍然不明白'缓冲区'?这是一个额外的可视化资源> http://reactivex.io/documentation/operators/buffer.html。使用Rxjs进入操作符,有一个特定于具有闭合选择器的'buffer'版本的绘图。一般来说,除了粘贴它们之外,还有一个很好的理解是值得的。 – user3743222

我觉得你需要的是timestamp运营商。然后,您可以过滤按键录音的速度。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timestamp.md