使用jQuery中止待处理/积压的AJAX请求

时间:2013-06-08 09:27:28

标签: jquery ajax backlog

我有以下脚本:

  $(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(),但我很确定只会停止任何尚未发送的请求(而不是告诉服务器停止处理)。这可能没问题,但我仍然不知道如何在我的代码中实现它。

1 个答案:

答案 0 :(得分: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');