1

コントローラーに ajax で呼び出すメソッドがあります。このメソッドは非常に頻繁に呼び出すことができます (ユーザーの入力速度によって異なります)。ユーザーは文字、単語を入力します。ユーザーが入力をやめたら、メソッドを呼び出す必要があります。

メソッドのパラメーターは、ユーザーが書いたテキストです。

私のやり方では、メソッドは短時間で何度も呼び出されます。

メソッドを常に(各文字の後に)呼び出す方法はありますが、すぐに呼び出された場合はすぐに実行を停止するメソッドはありますか?

例: ユーザーがゆっくりと 10 文字を書きます。メソッドは 10 回呼び出されます。例: ユーザーは 10 文字を高速で書き込みます。メソッドは 10 回呼び出されます。または、メソッドは 10 回呼び出されますが、最初の 9 回は実行を停止し、10 回目だけ実行を終了します。

4

3 に答える 3

3

AJAXで呼び出していると仮定すると、ロジックをクライアント側に配置する方がよいと思います。入力の一時停止後にのみ Ajax 呼び出しを送信するthrottle.jsのようなものを使用することを検討してください。

于 2012-07-18T15:43:25.147 に答える
0

これは、結果をバッファリングしてこのメ​​ソッドに渡すことで実現できます。基本的に、このメソッドをアグリゲーターメソッドでラップすることにより、これが常に発生するのを防ぐことができます。

//... Class Impl

private string keys = String.Empty;
private readonly TimeSpan bufferDelay = new TimeSpan(100000);
private DateTime lastKeyPress = DateTime.UtcNow;

private void DoSomething(string text)
{
//do something to process text.
    keys = String.Empty;

}


public void DoSomethingBuffer(string text)
{
    keys =+ text;
    var now = DateTime.UtcNow;
    if((now-lastKeyPress) > bufferDelay)
{
    DoSomething(keys);
}
    lastKeyPress = now;

}
//... More Class Impl

自然に感じる何かを見つけるには、集計時間ウィンドウを試してみる必要がありますが、それは比較的単純なはずです。DoSomethignではなくDoSOmethingBufferを直接呼び出します。

于 2012-07-18T15:51:52.670 に答える
0

JavaScriptタイマーを使用してそれを実現できます。ユーザーが最後にキーを押してから 0.5 秒経過するとロジックをトリガーする例を次に示します。ユーザーが入力し続けると、タイマーは常にキャンセルされます。

$(function() {
    var timer;
    $(".typeAhead").keypress(function() {
        if (timer != null)
            clearTimeout(timer);
        timer = setTimeout(function() {
            // do ajax call
        }, 500);
    });
});

このスニペットでは jquery を使用していますが、jquery を使用しなくても実行できます。getElementById()セレクターの代わりに使用してください。

于 2012-07-18T16:30:12.083 に答える