2010-08-11 10 views
16

Czy istnieje sposób przerwania wszystkich żądań Ajax na całym świecie bez uchwytów obiektu żądania?Przerwij wszystkie żądania jQuery AJAX na całym świecie

Powodem, dla którego pytam, jest to, że mamy dość złożoną aplikację, w której uruchamiamy wiele różnych żądań Ajax w tle za pomocą metody setTimeOut(). Jeśli użytkownik kliknie określony przycisk, musimy zatrzymać wszystkie bieżące żądania.

+1

możliwe duplikat [Zatrzymanie wszystkich aktywnych żądań AJAX w jQuery] (http://stackoverflow.com/questions/1802936/stop-all- active-ajax-requests-in-jquery) – Shoban

+0

@ shoban, ale myślę, że Robert pyta, czy istnieje sposób, jeśli nie masz do nich dostępu. – 7wp

+0

To pytanie może dostarczyć ci tego, czego szukasz http://stackoverflow.com/questions/1802936/stop-all-active-ajax-requests-in-jquery – codingbadger

Odpowiedz

11

Trzeba zadzwonić abort() metoda:

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

Po tym można przerwać żądanie:

request.abort(); 

ten sposób trzeba utworzyć zmienną na żądanie ajax, a następnie można użyć metoda abort na tym, aby przerwać żądanie w dowolnym momencie.

mają również do obejrzenia:

+0

Aby przerwać wiele żądań ajaxowych wypróbuj: http: // stackoverflow .com/a/42312101/3818394 –

7

Nie można przerwać wszystkie aktywne żądania Ajax, jeśli nie śledzi uchwyty do nich.

Ale jeśli go śledzisz, to tak, możesz to zrobić, wykonując pętlę za pomocą programów obsługi i dzwoniąc pod numer .abort().

3

Można użyć tego skryptu:

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

sprawdzić wynik na http://jsfiddle.net/s4pbn/3/.

+8

Skopiuj [tutaj] (http://stackoverflow.com/a/8841412/1767377) i wklej tutaj. Doceniam jsfiddle ** - 1, ponieważ nie dałeś kredytu, w którym spłacono kredyt. ** A teraz, gdy cytat z filmu: "znieważaj cię, zhańbić swoją krowę, zhańbić swojego wuja ..."-Mulan – SyntaxRules

+0

Metoda abortAll może być użyta tylko raz tutaj, ponieważ $ .xhrPool = []; zniszczy tę metodę.Jeśli chcesz użyć jej wielokrotnie, możesz zrobić $ .xhrPool.length = 0, zamiast tego – igrek

+2

Więcej informacji można znaleźć na stronie http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript. – igrek

3

To odpowiedź na pytanie jest powiązany co pracował dla mnie:

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

Uwaga pierwsza linia gdzie @grr mówi: „Korzystanie ajaxSetup nie jest prawidłowa”

można dostosować jego odpowiedź, aby dodać własną funkcję do okna, jeśli chcesz ją nazwać samodzielnie, zamiast używać window.onbeforeunload, tak jak oni.

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

Następnie można zadzwonić pod numer window.abortAllMyAjaxRequests();, aby przerwać wszystkie. Upewnij się, że dodajesz .fail(jqXHRFailCallback) do żądań ajax. Callback dostanie „przerwać” jako textStatus więc wiesz, co się stało:

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

Korzystanie z ajaxSetup nie jest "złe", ale nie wiesz, że to będzie aby powodować problemy, dopóki nie ... a czasami kiedy to robi, naprawdę trudno jest zapamiętać, że to ajaxSetup, który się z tobą miesza. :-) +1 do tej odpowiedzi za nieużywanie ajaxSetup. –

Powiązane problemy