Chcę mieć globalną metodę obsługi błędów dla wywołań ajax, oto co mam teraz:
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
Muszę zignorować błąd aborted
. errorThrown
jest null i textStatus
jest error
. Jak sprawdzić aborted
?
jquery
ajax
error-handling
Shawn Mclean
źródło
źródło
abort
ręcznie (a nie jestem pewien, kiedy indziej, że to się nazywa) można przekazać w komunikacie o błędzie:abort("abort")
.Odpowiedzi:
Dzisiaj miałem do czynienia z tym samym przypadkiem użycia. Aplikacja, nad którą pracuję, ma te długotrwałe wywołania ajax, które mogą zostać przerwane przez 1) nawigację użytkownika lub 2) tymczasową awarię połączenia / serwera. Chcę, aby program obsługi błędów działał tylko w przypadku awarii połączenia / serwera, a nie dla użytkownika odchodzącego.
Najpierw wypróbowałem odpowiedź Alastaira Pittsa, ale nie zadziałała, ponieważ zarówno przerwane żądania, jak i błąd połączenia ustawiają kod stanu i readyState na 0. Następnie wypróbowałem odpowiedź sieppl; również nie zadziałało, ponieważ w obu przypadkach nie ma odpowiedzi, a więc nie ma nagłówka.
Jedynym rozwiązaniem, które zadziałało, jest ustawienie nasłuchiwania dla window.onbeforeunload, które ustawia zmienną globalną wskazującą, że strona została wyładowana. Procedura obsługi błędów może następnie sprawdzić i wywołać procedurę obsługi błędów tylko wtedy, gdy strona nie została wyładowana.
var globalVars = {unloaded:false}; $(window).bind('beforeunload', function(){ globalVars.unloaded = true; }); ... $.ajax({ error: function(jqXHR,status,error){ if (globalVars.unloaded) return; } });
źródło
beforeunload
obsługi jest zdefiniowany przez użytkownika. Dlaczego miałbyś ustawić globalVars.unloaded na,true
jeśli zamierzasz anulować wyładowywanie w ten sam sposób?beforeunload
nie jest wywoływana, gdy użytkownik przechodzi na inną stronę lub dzwoni za późno?W nowoczesnym jQuery możesz po prostu sprawdzić, czy
request.statusText
jest równe'abort'
:error: function (request, textStatus, errorThrown) { if (request.statusText =='abort') { return; } }
źródło
Coś, co znalazłem, jest takie, że gdy istnieje przerwane żądanie,
status
i / lubreadyState
równe0
.W moim globalnym module obsługi błędów mam zaznaczenie na górze metody:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) { //If either of these are true, then it's not a true error and we don't care if (jqXHR.status === 0 || jqXHR.readyState === 0) { return; } //Do Stuff Here });
Odkryłem, że to działa idealnie dla mnie. Mam nadzieję, że to pomoże Tobie lub komukolwiek, kto w to wpadnie :)
źródło
Będziesz chciał przyjrzeć się argumentowi textStatus przekazanemu do funkcji błędu. Według http://api.jquery.com/jQuery.ajax/ , może on przyjmować wartości „sukces”, „notmodified”, „error”, „timeout”, „abort” lub „parsererror”. „Przerwij” jest oczywiście tym, przed czym chcesz sprawdzić.
Dłuższe notatki tutaj: jquery-gotcha-error-callback-triggered-on-xhr-abort
źródło
Ponieważ odpowiedź bluecollarcoders nie działa dla żądań Ajax przerwanych przez javascript, oto moje rozwiązanie:
var unloaded = false; ... $(window).bind('beforeunload', function(){ unloaded = true; }); $(document).ajaxError(function(event, request, settings) { if (unloaded || request.statusText == "abort") { return; } ... }
na przykład
handler = jQuery.get("foo") handler.abort()
będzie teraz ignorowany przez moduł obsługi ajaxError
źródło
Opierając się na odpowiedzi Alastaira Pittsa , możesz to również zrobić, aby uzyskać więcej informacji:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) { { if (jqXHR.status === 0) { alert('Not connect.\n Verify Network.'); } else if (jqXHR.status == 404) { alert('Requested page not found. [404]'); } else if (jqXHR.status == 500) { alert('Internal Server Error [500].'); } else if (exception === 'parsererror') { alert('Requested JSON parse failed.'); } else if (exception === 'timeout') { alert('Time out error.'); } else if (exception === 'abort') { alert('Ajax request aborted.'); } else { alert('Uncaught Error.\n' + jqXHR.responseText); } } });
źródło
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) { if (!jqXHR.getAllResponseHeaders()) { return; } });
źródło
Miałem tutaj ten sam problem, a jako rozwiązanie zastosowałem zmienną „przerywającą” tuż przed wywołaniem abort (), jak poniżej:
aborting = true; myAjax.abort();
i pokazuje tylko błąd w obsłudze błędów żądania ajax, jeśli abort nie jest prawdą.
$.ajax({ [..] error: function() { if ( !aborting ) { // do some stuff.. } aborting = false; } });
źródło
Jeśli ręcznie anulujesz żądanie Ajax, możesz zrobić to w następujący sposób:
var xhr; function queryData () { if (xhr) { // tag it's been aborted xhr.hasAborted = true; // manually canceled request xhr.abort(); } xhr = $.ajax({ url: '...', error: function () { if (!xhr.hasAborted) { console.log('Internal Server Error!'); } }, complete: function () { xhr = null; } }); }
źródło