2016-09-13 18 views
2

私がしようとしているのは、これらのイベント間の時間が短い場合、キーボードイベントの数を取得することです。 それは正しいアプローチではないので、私はまだ同じ場所にいます。RxJS - バッファを手動で出力する方法/バッファ内の要素を表示する方法

まずは、私が興味を持ったすべてのイベントを捕まえるために、フィルターを使って簡単なストリームを作りました。次に、セカンドストリームとグループ化されたイベントをペアにして、タイムスタンプを測定できます。それはかなり良いのですが、イベントの数が偶数であるようです - この期間が過ぎると、何かがバッファに入っているかどうかをチェックする必要があり、そこにあればそれを私の文字列に追加する必要があります。

コード:

const timeToWait : number = 500; 
const keyDigitsUp$ = Observable.fromEvent(document, "keyup") 
    .filter((event:any) => {return ((event.keyCode>=48 && event.keyCode <=57) || 
(event.keyCode>=96 && event.keyCode <=106))}); 

let bufferedEvents = Observable.from(keyDigitsUp$).bufferCount(2); 
let numbers : string = ""; 

bufferedEvents.subscribe((eventArray) => { 
    if (eventArray[1].timeStamp - eventArray[0].timeStamp <= timeToWait) 
    { 
     numbers+=eventArray[0].key + eventArray[1].key; 
    } 
    else 
    { 
     numbers=""; 
    } 
}); 

は、この概念の作品を作るためにどのような方法がありますか?それとも、私が逃しているアプローチがずっとあるかもしれません。私も他のコンセプトを作ったが、同様の結果を出していた。私はもちろん非反応的な方法で動作させることができますし、メインストリームにサブスクライブする - 最後のイベントが存在する場合はそれを次のように比較するよりも、私は反応的なプログラミングを勉強しようとしているので、私はできるだけ反応的です。

+0

明確化のために:最初にフレームを構築し、その時間フレームでキャプチャされたイベントに対してテストするか、2つのイベントを常にグループ化し、2つのイベントがtimeToWait '?固定時間枠に対してテストしたい場合は、これを見てください:https://jsfiddle.net/bbnprgmr/ – dotcs

+0

応答のためのThxルカ。ここでの私の目標は、それらの間のtimeStampが指定されていないイベントをキャプチャすることです。このように動作するはずです。私はキーボードの数字を押します。私は別のものを押すために500msを持っています。そうでなければ数字で文字列を出し、既存の文字列を消去します。私が時間(500ms)で別の数字を押すたびに、別の時間(この場合500ms)のバッファ時間をリセットする必要があります。時間とグループのバッファリングが混在している – 5k7

答えて

0

あなたはworking jsbinを参照してください

const timeout = 500; 

keyDigitsUp$ 
    .buffer(keyDigitsUp$.debounce(timeout)) 
    .map(events => (events.length <= 1 ? '' : events.map(event => event.key).join(','))) 
    .subscribe(v => console.log('events for timeout ' + timeout + ' msec: '+ v)); 

:-)あまりにもハード作業しています。

この方法は、タイムアウト(この場合は500)のキーのどれかが押されていない場合にだけバッファを閉じる(つまりチャンクを生成する)ことです。

私はあなたがキーコードで何をしたいのか分からないので、カンマ区切り文字で連結しています。

rxjs 5の構文が若干異なる場合があることに注意してください。

関連する問題