私は BaconJS を少し知っていますが、今は「ユーザーが入力中です...」インジケーターを作成して RxJS を学ぼうとしています。それは非常に単純で、2 つの単純なルールで説明できます。
- ユーザーが入力しているときに、インジケーターがすぐに表示される必要があります。
- ユーザーが入力を止めても、ユーザーの最後の入力アクションから 1 秒後までインジケーターが表示されたままになる必要があります。
これが正しいかどうかはわかりませんが、これまでに 2 つのストリームを作成しました。
- 1 秒ごとに を発行する 1 つのハートビート ストリーム
0
。 - ユーザー入力イベントをキャプチャし、
1
for every イベントを発行する 1 つのストリーム。
次に、それらをマージして、結果をタップするだけです。の場合1
は、インジケーターを表示します。の場合0
は、インジケーターを非表示にします。
これは次のようになります。
const showTyping = () =>
$('.typing').text('User is typing...');
const showIdle = () =>
$('.typing').text('');
// 1 second heartbeats are mapped to 0
const heartbeat$ = Rx.Observable
.interval(1000)
.mapTo(0);
// user typing events are mapped to 1
const input$ = Rx.Observable
.fromEvent($('#input'), 'input')
.mapTo(1);
// we merge the streams together
const state$ = heartbeat$
.merge(input$)
.do(val => val === 0 ? showIdle() : showTyping())
.subscribe(console.log);
JSBinへのリンクは次のとおりです。
http://jsbin.com/vekixuv/edit?js,コンソール,出力
この実装にはいくつかの問題と質問があります。
- ユーザーが入力しているときに、が
0
こっそり通り抜けることがあるため、次のユーザーのキーストロークに戻る前に、インジケーターが一瞬点滅します。 - ユーザーが入力を停止してから 1 秒後にインジケーターが消えることは保証されていません。インジケーターが 1 秒以内に消えることが保証されているだけです (これは、私たちが望むものとは逆です)。
- これを行うには、ハートビート ストリームを使用するのが RxJS の正しい方法ですか? そうじゃないかもって感じ。
私は自分の実装に完全にずれていると感じています。あなたが提供できるかもしれない助けに感謝します。ありがとう。