2009-12-04 8 views
29

Kann jQuery einen Fallback für fehlgeschlagene AJAX-Aufrufe bereitstellen? Dies ist mein Versuch:jQuery: Handle-Fallback für fehlgeschlagene AJAX-Anforderung

function update() { 
    var requestOK = false; 

    $.getJSON(url, function(){ 
     alert('request successful'); 
     requestOK = true; 
    }); 

    if (!requestOK) { 
     alert('request failed'); 
    } 
} 

Leider, auch wenn die Callback-Funktion des $ .getJSON() -Methode aufgerufen wird, erhalte ich die Meldung ‚Anforderung ist fehlgeschlagen‘, bevor die Callback-Funktion die Möglichkeit hat, die requestOK einstellen Variable. Ich denke es liegt daran, dass der Code parallel läuft. Gibt es eine Möglichkeit, mit solchen Situationen umzugehen? Ich dachte über das Verketten oder eine Art des Wartens auf die AJAX-Anfrage, einschließlich seiner Callback-Funktion. Aber wie? Weiß jemand, wie man das macht?

Antwort

61

Sie müssen entweder die untere Ebene $.ajax Anruf oder die ajaxError Funktion verwenden. Hier ist es mit der $ Schnipsel-Methode:

function update() { 
    $.ajax({ 
    type: 'GET', 
    dataType: 'json', 
    url: url, 
    timeout: 5000, 
    success: function(data, textStatus){ 
     alert('request successful'); 
    }, 
    error: function(xhr, textStatus, errorThrown){ 
     alert('request failed'); 
    } 
    }); 
} 

EDIT ich ein timeout zum $.ajax Anruf hinzugefügt und setzen Sie sich auf fünf Sekunden.

+0

das ist schon großartig! aber es scheint nicht zu funktionieren, wenn die Internetverbindung unterbrochen ist :(. Das ist ziemlich wichtig, weil ich ein Dashboard-Widget für osx entwickle und eine Art von Nachricht anzeigen möchte, die besagt, dass eine Anfrage nicht möglich war andere Tipps? –

+0

@Patrick, ich aktualisierte meine Antwort, um den "Timeout" -Parameter zu enthalten. Es sollte die Fehlerfunktion nach 5 Sekunden aufrufen, wenn die Internetverbindung unterbrochen ist. –

+1

danke eine Tonne! funktioniert perfekt! –

1

Ja, es ist in jQuery eingebaut. Siehe die Dokumentation unter jquery documentation.

ajaxError kann sein, was Sie wollen.

0

Ich glaube, dass für das, was Sie suchen Fehler Option für die jquery ajax object

getJSON ist ein Wrapper zum $.ajax Objekt ist, aber es funktioniert nicht mit Zugriff auf die Fehler Option bieten.

EDIT: dcneiner hat ein gutes Beispiel für den Code gegeben, den Sie verwenden müssen. (Auch bevor ich meine Antwort posten konnte)

+0

Falsche über getJSON gib keinen Zugriff auf Fehler. Sie können auf die Fehleroption zugreifen, indem Sie den getJSON-Aufruf verketten. Siehe @Lasse Dahl Eberts Antwort. – Fydo

+1

@Fydo - diese Antwort tatsächlich * predates * jQuery wurde um mehr als ein Jahr zurückgestellt ;-) Zu der Zeit gab es nun einen Weg, um auf den Fehler zuzugreifen, man musste auf die '$ .ajax' Methode zurückgreifen. –

8

Dougs Antwort ist korrekt, aber Sie können tatsächlich $.getJSON verwenden und Fehler (ohne $.ajax) zu fangen. Gerade Kette den getJSON Anruf mit einem Aufruf an die fail Funktion:

$.getJSON('/foo/bar.json') 
    .done(function() { alert('request successful'); }) 
    .fail(function() { alert('request failed'); }); 

Live-Demo: http://jsfiddle.net/NLDYf/5/

Dieses Verhalten Teil der jQuery.Deferred Schnittstelle ist.
Grundsätzlich können Sie Ereignisse an eine asynchrone Aktion anhängen nach nennen Sie diese Aktion, was bedeutet, dass Sie die Ereignisfunktion nicht an die Aktion übergeben müssen.

Lesen Sie mehr über hier jQuery.Deferred: http://api.jquery.com/category/deferred-object/

+1

'.error()' ist ab jQuery v1.8 veraltet und Sie sollten '.fail()' verwenden. – Cobby

+0

Danke. Ich habe es korrigiert. –

0

I dieser Ansatz bevorzugen, weil Sie das Versprechen zurückkehren können und verwenden .then (successFunction, failFunction); wo immer du willst.

var promise = $.ajax({ 
    type: 'GET', 
    dataType: 'json', 
    url: url, 
    timeout: 5000 
    }).then(function(data, textStatus, jqXHR) { 
    alert('request successful'); 
    }, function(jqXHR, textStatus, errorThrown) { 
    alert('request failed'); 
}); 

//also access the success and fail using variable 
promise.then(successFunction, failFunction);