2010-07-22 10 views
6

Czy jest jakiś łatwy sposób, aby zrezygnować z wszystkich zaległych żądań AJAX jQuery? Moja aplikacja jest w stanie wyciągnąć wiele równoczesnych żądań, więc wyścig staje się problematyczny. Wprowadziłem hackowe rozwiązania (mianowicie umieszczenie flagi, która jest sprawdzana po zakończeniu żądania), ale byłoby znacznie ładniej, aby uzyskać globalne zatrzymanie wszystkich zaległych zleceń.jQuery porzucenie wszystkich zaległych żądań AJAX

Odpowiedz

11

Przypisywanie każdy ajax żądanie jako element tablicy:

var requests = []; 

requests.push($.ajax({ 
    type: 'POST', 
    url: '...', 
    success: successfunc 
    }); 
); 

I zabić:

$.each(requests, function(i, v) { 
    v.abort(); 
}); 
+0

Dzięki. Wydaje się, że to się udało. Wybrałem nieco inną implementację, którą szczegółowo opisuję [tutaj] (http://stackoverflow.com/questions/3313059/jquery-abandon-all-outstanding-ajax-requests/3313954#3313954) –

1

Powiedziałbym przechowywać wszystkie żądania ajax w tablicy. Kiedy musisz zabić, po prostu przeprowadź pętlę przez wszystkie wartości w tablicy i wywołaj abort(). Gdy żądanie zostanie zakończone lub przerwane, po prostu wyskocz z tablicy.

2

XMLHttpRequest ma funkcję abort(). $ .ajax pozwala uzyskać dostęp do obiektu xhr. zachowaj rejestr wszystkich zaległych Xhr i przejdź xhr.abort() dla każdego, który chcesz zakończyć.

3

jak mówili inni, użyj metody .abort(). Jednak TYLKO działa na połączenia w tej samej domenie. gdy wchodzisz w połączenia międzymiejscowe (z jsonp), wtedy metoda .abort() jest delegowana do wartości null, więc w rzeczywistości nie uruchomi się.

Warto zauważyć, jak to sprawiało mi niekończące czas debugowania wiele mały księżyc temu :)

jim

+0

Fajna informacja, dzięki za te heads up . – Anders

+0

anders - pleasure ... (sprawdź najnowszy status na IE, ponieważ był to głównie XMLHttpRequest w IE, który był problemem przy próbie uczynienia z niego przeglądarki agnostycznej w moim przypadku). Wydaje mi się, że pamiętam, że przerwanie "timeout" jest ustawione na 0 w wywołaniach x-site. w każdym razie .. :) –

3

oparciu o rozwiązania Kena Redler jest, kładę to w moim inicjalizacji:

window.requests = [] 
$.ajaxSetup({ 
    beforeSend: function(xhr){ 
    var new_request_list = [xhr] 
    $.each(window.requests, function(k,v){ 
     if(v.readyState != 4) new_request_list.push(v) 
    }) 
    window.requests = new_request_list 
    } 
}) 

I wstawić fragment kodu z new_request_list tylko po to, aby zmienna globalna nie była wypełniona wypełnionymi obiektami XHR.

+0

Chciałbym umieścić funkcję oczyszczania w '$ .ajaxSetup' lub' xhr.onreadystatechange', ale jestem zaniepokojony, że to przeszkadzałoby w cokolwiek jQuery robi na własną rękę. To rozwiązanie wydaje się działać dobrze. –

1

Znalazłem na jsfiddle. Jest to w większości takie samo, jak powyżej, z wyjątkiem tego, że usunie wszystkie żądania po ich ukończeniu. Powyższe rozwiązania tylko dodają do tablicy. Więc z biegiem czasu może stać się ogromna, jeśli wykonujesz wiele wywołań ajaxowych. Dzwonisz pod numer $.xhrPool.abortAll();, gdy chcesz przerwać wszystkie zaległe żądania.

// $.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); 
     } 
    } 
}); 
Powiązane problemy