2015-11-20 36 views
0

我需要從條形碼掃描器獲取輸入,其工作方式與鍵盤完全相同,只是它「鍵入」的速度要快得多。 沒有分隔符,沒有行結束符。幾乎沒有辦法比較標量值 - 用戶輸入的內容可能完全是條形碼。從條形碼掃描器中緩衝擊鍵

我想這可能與Rx,因爲條碼掃描的速度比任何用戶都快。

如何從document.keypress事件中創建一個可區分用戶輸入和條形碼掃描器的Observable? 我猜它應該以某種方式緩衝/窗口值,每當有一個按鍵「突發」,然後之間暫停。

這樣做,仍然沒有幫助:

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

它只是抓住什麼,每一個半秒類型。 你們能幫我把這個東西包起來嗎?

回答

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

+0

對不起,我仍然在努力理解如何使用'與關閉選擇.buffer'。你能否用代碼片段來證明這一點。我會很感激。 – Agzam

+0

?我把你自己已經問過關於類似主題的問題(智慧緩衝區)聯繫起來。將代碼放在那裏,用'source.buffer(function(){return source.debounce(Xms)})'替換相應的行。究竟是什麼,你仍然不明白'緩衝區'?這是一個額外的可視化資源> http://reactivex.io/documentation/operators/buffer.html。使用Rxjs進入操作符,有一個特定於具有閉合選擇器的'buffer'版本的繪圖。一般來說,除了粘貼它們之外,還有一個很好的理解是值得的。 – user3743222