2010-07-22 117 views
26

基于:Abort Ajax requests using jQuery ...在inventory_search() - 在发出ajax请求之前,如何检查当前请求并在发出新请求之前终止()它们?或者...有没有更好的方法来做到这一点?jquery abort()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> 

回答

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(); 

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

希望这足以让你开始。

2

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

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) {}}); 
23

自旋子的回答是伟大的,中止所有的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); 
     } 
    }); 
} 
+1

+1我做的事情使用完全相同的方法吧。 (除''ajax_request' var name ^^)...并且它工作正常! – JoDev 2013-04-23 09:15:46

+0

我刚刚更改了'var ajax_request;'到'var ajax_request = new XMLHttpRequest();'它正在工作。 +1的想法。 – smartrahat 2017-11-08 17:57:36