2010-07-02 9 views
8

Wygląda na to, że sukces, błąd i kompletne wywołania zwrotne są uruchamiane tylko wtedy, gdy żądanie ajax jest w stanie uzyskać odpowiedź z serwera.Sprawdź status żądania ajax jQuery

Jeśli więc wyłączyłem serwer, następujące wywołanie zwrotne błędu nie zostanie wykonane, a żądanie nie powiedzie się po cichu.

$.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
    alert("success"); 
    }, 
    error: function() { 
    alert("error"); 
    } 
}); 

Jaki jest najlepszy sposób na zgłoszenie błędu, gdy w ogóle nie można uzyskać dostępu do serwera.

Edycja - Z tego, co wypróbowałem i przeczytałem, wynika, że ​​wbudowana obsługa błędów jQuery nie działa z JSONP, ani dataType: "script". Więc spróbuję ustawić ręczny limit czasu.

Edycja - Czy trochę więcej badań i wygląda nie tylko nie działa callback błędu ajax, ale nie można przerwać żądania ajax ze skryptu dataType lub jsonp, a te żądania ignorują ustawienie limitu czasu.

Istnieje alternatywa - wtyczka jquery-jsonp, ale używa ukrytych elementów iframe, których wolałbym uniknąć. Tak więc postanowiłem stworzyć ręczny limit czasu, jak sugerowano poniżej. Nie można przerwać żądania, jeśli upłynie limit czasu, co oznacza, że ​​skrypt może się załadować nawet po przekroczeniu limitu czasu, ale co najmniej coś zostanie uruchomione, jeśli serwer jest niedostępny.

+0

jQuery ajax ma wbudowaną obsługę błędów (zobacz moją odpowiedź poniżej) możesz użyć ajaxsetup, aby zastosować te opcje. – Sphvn

Odpowiedz

7

Można użyć numeru setTimeout i wyczyścić go za pomocą clearTimeout w pełnym module obsługi.

var reqTimeout = setTimeout(function() 
{ 
    alert("Request timed out."); 
}, 5000); 
var xhr = $.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
    alert("success"); 
    }, 
    error: function() { 
    alert("error");   
    }, 
    complete: function() { 
    clearTimeout(reqTimeout); 
    } 
}); 
+0

Wygląda na to, że to jedyne rozwiązanie. Do tej pory działa dobrze, z wyjątkiem xhr.abort(). Firebug podaje błąd, że xhr jest niezdefiniowany. –

0

Jeśli dobrze pamiętam, jQuery zgłasza wyjątki. Tak więc powinieneś być w stanie pracować z try { ... } catch() { ... } i obsługiwać go tam.

5

jQuery.ajax ma już preferencję timeout i powinien wywołać procedurę obsługi błędów w przypadku przekroczenia limitu czasu żądania. Sprawdź the fantastic documentation który mówi - ja go tu zacytować, kopalnię wyróżnień:

timeoutNumber

ustawić lokalny Czas (w milisekundach) na wniosek ...

oraz:

error (XMLHttpRequest, textStatus, errorThrown) Function

Funkcja do wywołania, jeśli żądanie się nie powiedzie. Funkcja jest przekazywana trzy argumenty: Obiekt XMLHttpRequest, ciąg opisujący typ błędu, który wystąpił i opcjonalny obiekt wyjątku, jeśli wystąpił. Możliwe wartości drugiego argumentu (oprócz wartości null) to "timeout", "error", "notmodified" i "parsererror". To jest wydarzenie Ajax.

+0

Niestety, dla parametru dataType: Jsonp lub script nie działa ani limit czasu, ani błąd. –

+0

Używam JSONP i działa^^, ale cokolwiek pływa po twojej łodzi. – Sphvn

+2

Dla JSON-P spróbuj projektu o nazwie 'jquery-jsonp'. –

0

Można użyć AjaxSetup Jquery do obsługi obsługi błędów.

$.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
     alert("success"); 
    }, error: function() { 
     alert("error"); 
    } 
    //AJAX SETUP "error"// 
    $.ajaxSetup({ 
     "error": function (XMLHttpRequest, textStatus, errorThrown) { 
      alert(XMLHttpRequest + ' ' + textStatus + ' ' + errorThrown); //however you want 
     } 
    }); 
0

w IE8, można użyć:

success: function(data, textStatus, XMLHttpRequest) { 
    if("success"==textStatus&&XMLHttpRequest){ 
     alert("success"); 
    }else{ 
     alert("server down"); 
    } 
    } 

ale to nie może pracować na Chrome, Firefox ... próbowałem

1
error: function (jqXHR, textStatus, errorthrown) { 
    if (jqXHR.readyState == 0) { 
     //Network error, i.e. server stopped, timeout, connection refused, CORS, etc. 
    } 
    else if (jqXHR.readyState == 4) { 
     //HTTP error, i.e. 404 Not found, Internal Server 500, etc. 
    } 
} 

Używaj readyState z XMLHttpRequest w celu określenia stanu żądania AJAX. 'readyState' zawiera status XMLHttpRequest.

  • 0: nie żądanie inicjowane
  • 1: Połączenie serwera ustalone
  • 2: żądanie odebrane
  • 3: przetwarzanie żądania
  • 4: żądania zakończone i reakcja jest gotowy
Powiązane problemy