問題タブ [debouncing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 複数のクリックのデバウンス
すべての検証が適切な場合にメールを送信するコードがあります。ユーザーが複数回クリックするのをブロックするだけです。したがって、デバウンスを使用してみましたが、デバウンスが関数を呼び出していることを確認しましたが、どちらも役に立ちません。私は何を間違っていますか?すばやく連続してクリックすると、ポップアップが常に表示されます。
redis - Redisリストを排出する分散「デバウンス」タスクを作成する方法は?
次のユースケースがあります: 複数のクライアントが共有 Redis リストにプッシュします。別のワーカー プロセスがこのリストを排出する必要があります (プロセスと削除)。確認のために待機/マルチ実行が用意されており、これはスムーズに進みます。
パフォーマンス上の理由から、「ドレイン」プロセスをすぐに呼び出したくはありませんが、最初のクライアントが (その後空の) リストにプッシュした瞬間から x ミリ秒後に開始します。
これは分散アンダースコア/ロダッシュデバウンス関数に似ており、最初のアイテムが入った瞬間にタイマーが実行を開始します (つまり、「末尾」ではなく「先頭」)。
フォールトトレラントな方法でこれを確実に行うための最良の方法を探しています。
現在、私は次の方法に傾いています:
- andメソッドでRedis Setを使用します。これにより、次のことが可能になります。
NX
px
- 値 (ミューテックス) を専用のキースペースに設定する (まだ存在しない場合)。これが
nx
引数の使用目的です - x ミリ秒後にキーの有効期限が切れます。これが
px
引数の使用目的です
- 値 (ミューテックス) を専用のキースペースに設定する (まだ存在しない場合)。これが
- このコマンドは
1
、値を設定できた場合、つまり以前に値が存在しなかった場合に戻ります。それ以外の場合は返し0
ます。A1
は、現在のクライアントが、Redis リストが排出されてからプロセスを実行した最初のクライアントであることを意味します。したがって、 - このクライアントは、x ミリ秒で実行されるようにスケジュールされた分散キューにジョブを配置します。
- x ミリ秒後、ジョブを受け取るワーカーは、リストを排出するプロセスを開始します。
これは紙の上では機能しますが、少し複雑に感じます。これを分散フォールトトレラントな方法で機能させる他の方法はありますか?
ところで: Redis と分散キューは既に配置されているため、この問題でそれを使用することが余分な負担になるとは考えていません。
javascript - デバウンスされたメソッドを呼び出すかどうかの角度条件付きウォッチが機能しない
スコープ変数を監視する次の角度付きウォッチがあり、次のことを実行します。デバウンスを使用して、リクエストをバックエンドにバンドルします。
この myQuery が undefined を返した場合、このデバウンスは必要なく、代わりにバックエンド呼び出しを直接実行する必要があります。
現在、デバウンスは私のリクエストを適切にバンドルしていません。
bash - inotifywait ループを中断またはデバウンスするにはどうすればよいですか?
を使用してファイルの変更を監視inotifywait
する小さなスクリプトがあります。何かが変更されると、実行に約 10 秒かかるプロセス (コンパイル、圧縮、再編成など) を介してファイルのバッチが送信されます。
次の例を検討してください。
別のターミナルで数回実行するtouch oli-test
と、ループが進む前に各ループが完了することがわかります。そのシナリオは私にとって非常に現実的です。すでに処理中のファイルを保存するのを忘れたり、間違いに気づいたりすると、イベントが積み重なり、何分も待たされることになります。
このワークフローを客観的に改善するには、2 つの手法があることに気づきました。何が一番簡単かよくわからないので、両方を紹介します。
前のランスルーを中断し、すぐに再起動します。スクリプト化されたプロセスは、現在、単なるコマンドのインライン セットです。それらを Bash 関数に分割することはできますが、それ以上に分割することに夢中ではありません。
処理待ちのリストをデバウンスして、5 つのイベントが同時に発生した場合 (または既に処理中に発生した場合)、もう一度だけ実行するようにします。
(または両方...両方が役立つ場合があると確信しているため)
私は異なるアプローチにもオープンですinotifywait
が、それらは私に同じ結果をもたらし、Ubuntuで作業する必要があります。