5

ここで説明しているものにはおそらく名前があると思いますが、私は知りません。だから私の最初の質問は、このテクニックの名前を知ることです.

以下に例を示します。Web ページにライブ検索を実装しているとします。ユーザーが検索ボックスに入力するたびに、新しい検索クエリが起動され、結果が可能な限り頻繁に更新されます。実際に必要な数よりもはるかに多くのクエリを送信することになるため、これは愚かなことです。2 ~ 3 文字ごとに 1 回、または多くても 100 ミリ秒ごとに 1 回リクエストを送信すれば、おそらく十分です。

したがって、キーが入力された直後にクエリが実行されるようにスケジュールし、計画されているが実行されていないクエリがまだある場合は、それらは廃止されているためキャンセルするという手法があります。


より具体的には、Java でこの問題を解決するための特定のパターンまたはライブラリはありますか?

私は Swing アプリで問題を解決する必要があり、キャンセルできる ScheduledFutures を返す ExecutorService を使用しました。問題は、「バッファリング」したいメソッド呼び出しごとに Runnable を手動で作成し、各 Future を追跡してキャンセルしなければならなかったことです。

私はこのようなものを実装した最初の人ではないと確信しているので、再利用可能なソリューションがどこかにあるはずです? 注釈とプロキシを備えたおそらくSpringの何か?

4

3 に答える 3

12

他の答えを考えると、いくつかの検索の後、私が望んでいたことを行うライブラリが実際にないようです。

1 つ作成し、GitHub に配置しました。この質問の将来の読者は、興味深いと思うかもしれません。

https://github.com/ThomasGirard/JDebounce

まだあまり良いとは思いませんが、少なくとも機能し、宣言的に使用できます。

@Debounce(delayMilliseconds = 100)
public void debouncedMethod(int callID, DebounceTest callback) { }
于 2013-09-12T07:45:42.927 に答える
1

必要なものはdebounceと呼ばれます。jQuery Throttle/Debounce プラグインを確認する必要があります(これは、同じ名前空間を使用することを除いて、jQuery から完全に独立しています)。必要なものはデバウンス部分でカバーされています:

jQuery スロットル/デバウンスを使用すると、遅延と関数を渡して $.debounce新しい関数を取得できます。これは、繰り返し呼び出されると、呼び出しの「束」ごとに 1だけ元の関数を実行し、複数の連続した呼び出しを効果的に 1 つの実行に結合します。始まりか終わりか。

Underscore.jsには同じメソッドがあります。

_.debounce(function, wait, [immediate]) 

wait渡された関数の新しいデバウンス バージョンを作成して返します。これは、最後に呼び出されてからミリ秒が経過するまで実行を延期します。入力が到着しなくなった後にのみ発生するはずの動作を実装するのに役立ちます。たとえば、Markdown コメントのプレビューのレンダリング、ウィンドウのサイズ変更が停止した後のレイアウトの再計算などです。

// example: debounce layout calculation on window resize
var lazyLayout = _.debounce(calculateLayout, 300);
$(window).resize(lazyLayout);

[編集]

Javaではなく「Javascript」と読み間違えました。その後、実際の Java ソリューションはOP によって作成されました。

于 2013-09-11T08:49:15.417 に答える