Gibt es ein Analogon zu einem "Endlich" in jQuery AJAX-Aufrufen?

80

Gibt es ein Java-Endlich-Analogon in jQuery AJAX-Aufrufen? Ich habe diesen Code hier. In meinem Fall löse ich immer eine Ausnahme, aber ich möchte IMMER, dass sie zur then () -Methode wechselt.

    call.xmlHttpReq = $.ajax({
        url : url,
        dataType : 'json',
        type : 'GET'
    }).always(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

       throw "something";

    }).then(function() {

        alert("i want to always run no matter what");
    });

Ich habe versucht, done () , complete () und das andere always () zu verwenden , aber nichts scheint zu funktionieren.

Hier ist JSFiddle:

http://jsfiddle.net/qv3t3L0m/

Oliver Watkins
quelle
füge es einfach an always...
David Fregoli
1
Sie können keine asynchron ausgelösten Fehler abfangen, wenn Sie danach suchen. Sie müssen es selbst in eine try-catch-finallyErklärung einwickeln .
Bergi
3
Es Immer geht an die immer () Funktion, das ist , warum es so treffend benannt.
Adeneo
Sofern jQuery nicht jeden Versuch / Fang in einem Rückruf verarbeitet, throw "something";wird die Codeausführung einfach gestoppt.
Plalx
@Bergi, ich bin nicht mit den Versprechen von jQuery vertraut, aber wenn es Promises / A + -konform ist, werden die ausgelösten Fehler an einen Fehler übergeben, der an diesen übergeben wird. Wenn er also eine zweite Funktion an dann übergibt, erhält dieser "etwas" als Parameter.
David McMullin

Antworten:

127

Siehe dieses Beispiel:

$.ajax({
        type: "GET",
        dataType: dataType,
        contentType: contentType,
        async: TRUE,
        url: $('html form:nth-child(1)').attr('action') + "?" $('html form:nth-child(1)').serialize(),
        success: function(data) {
            console.log("FUNFOU!");
        },
        error: function(data) {
            console.log("NÃO FUNFOU!");
        },
        complete: function(data) {
            console.log("SEMPRE FUNFA!"); 
            //A function to be called when the request finishes 
            // (after success and error callbacks are executed). 
        }
    });

Für weitere Informationen: http://api.jquery.com/jquery.ajax/

Rafael Gomes Francisco
quelle
26
.complete()wurde veraltet; verwenden .always()jetzt. api.jquery.com/jQuery.ajax
mlg
4
Gefiel für das FUNFAR-Verb: D
Bruno Rodrigues
4
@mlg: Der vollständige Parameter ist nicht veraltet, er hat nur den Rückruf .complete () veraltet, da jetzt jqXHR-Objekte die Promise-Schnittstelle implementieren. Siehe Antwort auf diese Frage: stackoverflow.com/questions/15821141/…
jeanie77
45

.always()sollte arbeiten. Weitere Informationen finden Sie im Abschnitt Das jqXHR-Objekt unter http://api.jquery.com/jQuery.ajax/ .

jqXHR.always (Funktion (Daten | jqXHR, textStatus, jqXHR | errorThrown) {}); Die .always () -Methode ist ein alternatives Konstrukt zur vollständigen Rückrufoption und ersetzt die veraltete .complete () -Methode.

Bei einer erfolgreichen Anforderung stimmen die Argumente der Funktion mit denen von .done () überein: data, textStatus und das jqXHR-Objekt. Für fehlgeschlagene Anforderungen sind die Argumente dieselben wie für .fail (): das jqXHR-Objekt, textStatus und errorThrown. Einzelheiten zur Implementierung finden Sie unter deferred.always ().

Siehe auch http://api.jquery.com/deferred.always/

jrummell
quelle
11

Die folgenden Vorschläge funktionieren in jQuery nicht, da die Versprechenimplementierung von jQuery keine Fehler in den bis dahin übergebenen Methoden behandelt. Ich lasse sie hier nur als Beispiel dafür, was möglich sein könnte, wenn jQuery Versprechen / A + -konform wäre. Wie Bergi zu Recht betont, müssen Sie Ihren Code manuell in Ihren eigenen Try-Catch-Block einbinden.

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).always(function() {

    alert("i want to always run no matter what");
});

Obwohl ich nicht sicher bin, ob das Versprechen von jquery immer unterstützt, besteht eine Alternative darin, dann (erneut) dieselbe Funktion wie successHandler und errorHandler zu verwenden und Folgendes zu übergeben:

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).then(function() {

    alert("i want to always run no matter what");
},
function() {

    alert("i want to always run no matter what");
});
David McMullin
quelle
jQuery's thenfängt keine Fehler im Rückruf ab. Hast du das versucht?
Bergi
Entschuldigung, ich habe versucht, then-> immer zu verwenden und zwei Funktionen in meinem then zu haben, aber ich habe immer noch das gleiche Problem.
Oliver Watkins
Aufrichtige Entschuldigung, nachdem ich mir die zurückgestellten Dokumente von jquery angesehen hatte, dachte ich, dass dies funktionieren würde, aber ich habe mich eindeutig geirrt und Bergi weist zu Recht darauf hin, dass ich in einem Sandkasten hätte einchecken sollen.
David McMullin
3

Nur ein Hinweis für diejenigen, die jQuery 3.0 und höher verwenden

Verfallshinweis: Die Rückrufe jqXHR.success (), jqXHR.error () und jqXHR.complete () werden ab jQuery 3.0 entfernt. Sie können stattdessen jqXHR.done (), jqXHR.fail () und jqXHR.always () verwenden.

Wie in der offiziellen Dokumentation

Jayavardhan Gange
quelle
2

Es gibt einen Fehler, den Ajax vom Server abhängig macht. Der Status muss mit "vollständig" überprüft werden. Dies ist die beste, eine Art "Erfolg", "Fehler" und andere machen nicht 100% des PUT-, POST- und GET-Looks aus an einem Beispiel

$.ajax({
    url: '/api/v2/tickets/123456.json',
    ....
    ....
    ....
    complete: function(data) { 
        if (data.statusText == "success") { 
            console.log("Sent successfully");
        } else { 
            console.log("Not Sent");
        }
    }
});

Sorry schlechtes Englisch! Prost ;-)

KingRider
quelle
1

Wenn Sie eine Codedefinition für alle Ajax-Anforderungen wünschen, können Sie dies folgendermaßen tun

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
Sairfan
quelle