2010-08-11 50 views
16

有沒有辦法在請求對象沒有句柄的情況下全局中止所有的Ajax請求?全局中止所有jQuery AJAX請求

我問的原因是我們有一個相當複雜的應用程序,我們使用setTimeOut()在後臺運行多個不同的Ajax請求。如果用戶點擊某個按鈕,我們需要停止所有正在進行的請求。

+1

的可能重複[停止jQuery中所有活動的Ajax請求(http://stackoverflow.com/questions/1802936/stop-all- activejax-requests-in-jquery) – Shoban 2010-08-11 08:07:05

+0

@shoban,但我認爲如果你沒有處理它們,RobertW會問是否有辦法。 – 7wp 2010-08-11 08:10:29

+0

此問題可能爲您提供您正在尋找什麼http://stackoverflow.com/questions/1802936/stop-all-active-ajax-requests-in-jquery – codingbadger 2010-08-11 08:04:09

回答

11

你需要調用abort()方法:

var request = $.ajax({ 
    type: 'POST', 
    url: 'someurl', 
    success: function(result){..........} 
}); 

之後,你可以中止請求:

request.abort(); 

這樣,你需要創建一個變量爲您的Ajax請求,然後就可以使用在任何時候中止請求的abort方法。

也看看:

+0

要中止多個ajax請求嘗試:http:// stackoverflow .com/a/42312101/3818394 – 2017-02-18 07:01:51

7

你不能中止所有活動的Ajax請求,如果您不跟蹤把手給他們。

但是,如果您正在跟蹤它,那麼您可以通過循環處理程序並在每個處理程序上調用.abort()來做到這一點。

3

你可以使用這個腳本:

// $.xhrPool and $.ajaxSetup are the solution 
$.xhrPool = []; 
$.xhrPool.abortAll = function() { 
    $(this).each(function(idx, jqXHR) { 
     jqXHR.abort(); 
    }); 
    $.xhrPool = []; 
}; 

$.ajaxSetup({ 
    beforeSend: function(jqXHR) { 
     $.xhrPool.push(jqXHR); 
    }, 
    complete: function(jqXHR) { 
     var index = $.xhrPool.indexOf(jqXHR); 
     if (index > -1) { 
      $.xhrPool.splice(index, 1); 
     } 
    } 
}); 

檢查結果在http://jsfiddle.net/s4pbn/3/

+8

您複製了[here](http://stackoverflow.com/a/8841412/1767377)並將其粘貼到此處。雖然我很欣賞jsfiddle ** - 1,因爲你沒有在信用到期時給予信用。**而現在對於電影報價:「羞辱你,侮辱你的牛,侮辱你的叔叔......「-Mulan – SyntaxRules 2013-08-08 15:53:57

+0

abortAll方法在這裏只能使用一次,因爲$ .xhrPool = [];會銷燬方法,如果你想多次使用它,你可以使用$ .xhrPool.length = 0;而不是 – igrek 2013-10-02 11:49:57

+2

有關詳細信息,請參閱http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript – igrek 2013-10-02 11:54:42

3

這回答一個相關的問題是對我工作:

https://stackoverflow.com/a/10701856/5114

注意的第一線,其中@grr說:「使用ajaxSetup不正確」

您可以調整自己的如果你想自己打電話而不是像他們一樣使用window.onbeforeunload,那麼你可以將自己的功能添加到窗口中。

// Most of this is copied from @grr verbatim: 
(function($) { 
    var xhrPool = []; 
    $(document).ajaxSend(function(e, jqXHR, options){ 
    xhrPool.push(jqXHR); 
    }); 
    $(document).ajaxComplete(function(e, jqXHR, options) { 
    xhrPool = $.grep(xhrPool, function(x){return x!=jqXHR}); 
    }); 
    // I changed the name of the abort function here: 
    window.abortAllMyAjaxRequests = function() { 
    $.each(xhrPool, function(idx, jqXHR) { 
     jqXHR.abort(); 
    }); 
    }; 
})(jQuery); 

然後您可以撥打window.abortAllMyAjaxRequests();中止它們全部。確保你將一個.fail(jqXHRFailCallback)添加到你的ajax請求中。回調將得到「中止」作爲textStatus所以你知道發生了什麼:

function jqXHRFailCallback(jqXHR, textStatus){ 
    // textStatus === 'abort' 
} 
+0

使用ajaxSetup不是「錯誤」,但你不知道它會發生導致問題,直到它......並且有時當它發生時,真的很難記住它是與你混淆的ajaxSetup。:-) +1這個答案不使用ajaxSetup。 – 2016-04-22 14:57:05