在发送另一个之前,jquery abort()ajax请求

时间:2010-07-22 20:08:19

标签: javascript jquery ajax

基于:Abort Ajax requests using jQuery ...在inventory_search()中 - 在发出ajax请求之前,如何检查当前请求并在发出新请求之前中止()它们?或者......有更好的方法吗?

<script type="text/javascript">

    $(function() {
        $('form#internal_catalog').change(function() {
            inventory_search();
        });
    });

    function inventory_search() {
        var search_data = $('form#internal_catalog').serialize();
        var a = $.ajax({
            type: 'post',
            url: '/test.php',
            data: search_data,
            success: function(data) {
                $('#catalog').html(data);
            }
        });
    }

</script>

4 个答案:

答案 0 :(得分:61)

创建所有请求的数组队列。然后,如果您找到需要中止所有现有请求的点,则可以循环遍历该数组并对所有挂起的请求调用abort。应该很简单。

虽然另一种方法是保留一个内部标志,指示当前是否正在处理请求,如果有请求则跳过请求。或者处理你认为合适的方式。

编辑:针对类似情况检查此问题:How to avoid 3 ajax calls?

编辑2:所以我可以做的是有一个数组,你附加所有的ajax调用。这实际上只是制作一个XmlHttpRequest,这是从ajax调用返回的内容。所以

requests.push(
    $.ajax({
        type: 'post',
        url: '/test.php',
        data: search_data,
        success: function(data) {
            $('#catalog').html(data);
        }
    }));

这会将您的所有请求添加到您可以在某处定义的请求数组中。然后当你想要杀死所有挂起的请求时,你可以循环遍历数组并调用abort来终止请求。

for(var i = 0; i < requests.length; i++)
    requests[i].abort();

或者只是在函数外部定义一个变量,该变量是一个标志,指示是否正在发出请求。您甚至可以使其更具体并存储搜索数据,并且只跳过对相同数据有待处理请求的请求,并允许针对不同数据的其他请求。

希望这足以让你开始。

答案 1 :(得分:23)

Spinon的答案非常适合中止所有ajax查询但不能很好地跟踪一个查询。

我经常发现自己在做像

这样的事情
var ajax_request;
function do_something()
{
    if(typeof ajax_request !== 'undefined')
        ajax_request.abort();
    ajax_request = $.ajax({
        type: 'post',
        url: '/test.php',
        data: search_data,
        success: function(data) {
            $('#catalog').html(data);
        }
    });
}

答案 2 :(得分:4)

使用jQuery AjaxManager Plugin非常简单:

$.manageAjax.create('unique_identifier',{
queue:'clear',cacheResponse:false,maxRequests:1,abortOld:true
});
jQuery.manageAjax.abort('unique_identifier');
jQuery.manageAjax.clear('unique_identifier');
jQuery.manageAjax.add('unique_identifier',{success: function(data) {}});

答案 3 :(得分:2)

使用全局变量来保存当前请求的句柄。在这种情况下,声明函数的var a并将其设置为全局。在调用ajax检查之前,它不是null。如果它不是null abort,那么另外明智地用新的ajax分配它。在success / complete事件中,请确保清除变量a。可能不是最好的解决方案,但效果最好。