1

次のスクリプトがあります。

  $(document).ready(function(){
    $('#input').keyup(function(){
        sendValue($(this).val());   

    }); 

});
function sendValue(str){
    $.post("ajax.php",{ sendValue: str },
    function(data){
        $('#display').html(data.returnValue);
    }, "json");

}

このスクリプトはインスタント検索タイプのシナリオ (Google など) で使用されるため、ユーザーがテキスト ボックスに入力すると、かなりの数の選択要求がサーバーに送信されます (ただし、既に pconnect を使用しているため、データベース接続が繰り返されることはありません)。

これは非常に大規模なデータベースであり、すべてのキーストロークが AJAX リクエストとして送信されるため、保留中のリクエストのバックログが大量に発生します。新しいリクエストを送信するたびに、以前のすべてのリクエストを停止/キャンセルしたい(返送されていない場合)。

私は見てきましたxhr.abort()が、まだ送信されていないリクエストを停止するだけだと確信しています(サーバーに処理を停止するように指示するのではなく)。これはおそらく問題ありませんが、コードに実装する方法がまだわかりません。

4

1 に答える 1

2

最後のリクエストを非グローバル スコープに保存するために、これと同様のアプローチを使用できます。

function getSendValueFunction(){
    var lastRequest;

    return function(str){
        if (lastRequest){
            lastRequest.abort(); // abort pending request
        }
        // assign pending request, when created
        lastRequest = $.post("ajax.php",{ sendValue: str },
        function(data){
            lastRequest = null; // clear pending request
            $('#display').html(data.returnValue);
        }, "json");

    }
}

var sendValue = getSendValueFunction();

getSendValueFunction最後の保留中の要求の個別のレジスタを持つ関数を返すことを覚えておいてください。したがって、これにより、完全に分離された2つの異なる保留中のリクエストが作成されます。

var sendValue1 = getSendValueFunction();
var sendValue2 = getSendValueFunction();
sendValue1('aaa');
sendValue2('bbb');
于 2013-06-08T09:32:42.347 に答える