2010-07-02 3 views
8

Es scheint, dass der Erfolg, Fehler und vollständige Rückrufe nur ausgelöst werden, wenn die Ajax-Anfrage eine Antwort vom Server erhalten kann.Überprüfen Sie den Status einer jQuery Ajax-Anforderung

Wenn ich also den Server heruntergefahren habe, wird der folgende Fehlerrückruf nicht ausgeführt und die Anforderung schlägt im Hintergrund fehl.

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

Was ist der beste Weg, um einen Fehler zu werfen, wenn der Server überhaupt nicht erreicht werden kann.

Bearbeiten - Von was ich versucht habe und gelesen, es scheint, dass jQuery integrierte Fehlerbehandlung nicht mit JSONP oder dataType funktioniert: "Skript". Also werde ich versuchen, eine manuelle Zeitüberschreitung einzustellen.

Edit - Hat ein wenig mehr Forschung und es sieht aus wie nicht nur die Ajax-Fehler Callback nicht funktioniert, aber Sie können eine Ajax-Anfrage mit DataType-Skript oder Jsonp nicht abbrechen, und diese Anfragen ignorieren die Timeout-Einstellung.

Es gibt eine Alternative - das jquery-jsonp-Plugin, aber es verwendet versteckte iframes, die ich lieber vermeiden würde. Daher habe ich mich darauf festgelegt, ein manuelles Timeout zu erstellen, wie unten vorgeschlagen. Sie können die Anforderung nicht abbrechen, wenn das Zeitlimit überschritten wird. Dies bedeutet, dass das Skript möglicherweise auch nach dem Zeitlimit noch geladen wird, aber zumindest wird etwas ausgelöst, wenn der Server nicht verfügbar ist.

+0

jQuerys ajax hat eine integrierte Fehlerbehandlung (siehe meine Antwort unten). Sie können ajaxsetup verwenden, um diese Optionen anzuwenden. – Sphvn

Antwort

7

Sie können einen setTimeout verwenden und im vollständigen Handler mit clearTimeout löschen.

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

Es sieht so aus, als ob dies die einzige Lösung ist. Bis jetzt funktioniert es gut, bis auf die xhr.abort(). Firebug gibt einen Fehler, dass xhr nicht definiert ist. –

0

Wenn ich mich richtig erinnere, löst jQuery Ausnahmen. Somit sollte man in der Lage sein mit try { ... } catch() { ... } zu arbeiten und dort zu arbeiten.

5

jQuery.ajax hat bereits eine timeout Präferenz und es sollte Ihren Fehler Handler sollte die Anfrage Time-out. Schauen Sie sich the fantastic documentation, die sagt - ich würde es hier zitieren, Hervorhebung von mir:

timeoutNumber

Stellen Sie eine lokale Timeout (in Millisekunden) für die Anfrage ...

und:

error (XMLHttpRequest, textStatus, errorThrown) Function

Eine Funktion aufgerufen werden, wenn die Anfrage fehlschlägt. Der Funktion werden drei Argumente übergeben: Das XMLHttpRequest-Objekt, eine Zeichenfolge, die den Typ des aufgetretenen Fehlers beschreibt, und ein optionales Ausnahmeobjekt, falls eines aufgetreten ist. Mögliche Werte für das zweite Argument (neben null) sind "timeout", "error", "notmodified" und "parsererror". Dies ist ein Ajax-Ereignis.

+0

leider funktionieren weder timeout noch error für dataType: Jsonp oder script. –

+0

Ich benutze JSONP und es funktioniert ^^ aber was auch immer dein Boot schwimmt. – Sphvn

+2

Für JSON-P versuchen Sie ein Projekt namens 'jquery-jsonp'. –

0

Sie können Jquery AjaxSetup verwenden, um Ihre Fehlerbehandlung zu behandeln.

$.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

in IE8 können, verwenden:

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

aber auf Chrom nicht Arbeit kann, firefox ... ich versuchte

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. 
    } 
} 

Verwenden readyState von XMLHttpRequest den Status der Ajax-Anforderung zu bestimmen. 'readyState' enthält den Status von XMLHttpRequest.

  • 0: Anforderung nicht
  • initialisiert
  • 1: Server-Verbindung hergestellt
  • 2: Anfrage
  • empfangenen
  • 3: Verarbeitungsanforderung
  • 4: fordern fertig und Antwort bereit ist
Verwandte Themen