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

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

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

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

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

编辑:检查这个问题类似的情况: 如何避免3 ajax调用?

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

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

希望这足以让你入门。

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

使用jQuery AjaxManager插件非常简单:

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

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