web-dev-qa-db-de.com

Gibt es ein Analogon zu "endlich" in jQuery? AJAX Anrufe?

Gibt es ein Java 'endlich' Analogon in jQuery AJAX - Aufrufen? Ich habe diesen Code hier. In meinem always werfe ich eine Ausnahme aus, ich möchte jedoch IMMER, dass die then () -Methode verwendet wird.

    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/

49
Oliver Watkins

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/

.always() sollte funktionieren. Siehe den Abschnitt The jqXHR Object unter http://api.jquery.com/jQuery.ajax/ .

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

Als Antwort auf eine erfolgreiche Anforderung sind die Argumente der Funktion das Dasselbe wie bei .done (): data, textStatus und das Objekt jqXHR. Zum Bei fehlgeschlagenen Anforderungen entsprechen die Argumente denen von .fail (): der jqXHR-Objekt, textStatus und errorThrown. Siehe deferred.always () für Implementierungsdetails.

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

31
jrummell

Die folgenden Vorschläge funktionieren in jQuery nicht, da die Versprechungsimplementierung von jQuery keine Fehler behandelt, die in den an diese übergebenen Methoden ausgegeben werden. Ich lasse sie hier nur als Illustration, was möglich wäre, wenn jQuery versprochen/A + -konform wäre. Wie Bergi zu Recht darauf hinweist, müssen Sie Ihren Code manuell in Ihren eigenen try-catch-Block packen.

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 wird, wäre es eine Alternative, dann (wieder) die gleiche Funktion zu übergeben wie beide, successHandler und errorHandler.

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");
});
8
David McMullin

Nur eine Anmerkung für diejenigen, die jQuery 3.0 und höher verwenden

Hinweis zur Zurückweisung: 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

2

Es gibt einen Fehler, den ajax vom Server abhängt, der Status muss mit "complete" überprüft werden, der beste ist, eine Art "Erfolg", "error" und andere sind nicht 100% von PUT, POST und GET ... schau dir ein Beispiel an

$.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! Beifall ;-)

1
KingRider

wenn Sie eine Codedefinition für alle Ajax-Anforderungen haben möchten, können Sie dies wie folgt tun

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