Sollte ich .done () und .fail () für neuen jQuery AJAX-Code anstelle von Erfolg und Fehler verwenden?


166

Ich habe so codiert:

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID },
    success: function (data) {
        $('#CityID').html(data);
    },
    error: function (ajaxContext) {
        alert(ajaxContext.responseText)
    }
});

Aber wenn ich mir die jQuery- .ajax()Dokumentation am Ende ansehe, scheint es nahezulegen, dass ich wie folgt codieren sollte, oder zumindest schlägt es vor, a .done()und a hinzuzufügen .fail():

var request = $.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
});

request.done(function (data) {
    xxx;
});
request.fail(function (jqXHR, textStatus) {
    xxx;
});

Aktualisieren

Wenn ich so codiere, ist es dasselbe oder hat es einen Vorteil, es in drei Teile zu teilen?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});

Antworten:


164

Wie von user2246674 angegeben, ist die Verwendung von successund errorals Parameter der Ajax-Funktion gültig.

Lesen Sie das Dokument, um mit der vorherigen Antwort übereinzustimmen:

Verfallserklärung :

Die Rückrufe jqXHR.success (), jqXHR.error () und jqXHR.complete () sind in jQuery 1.8 veraltet. Verwenden Sie stattdessen jqXHR.done (), jqXHR.fail () und jqXHR.always (), um Ihren Code für das eventuelle Entfernen vorzubereiten.

Wenn Sie die Rückruf-Manipulationsfunktion (Verwendung von Methode Verkettungs zum Beispiel) verwenden, verwenden .done(), .fail()und .always()statt success(), error()und complete().


54
Ich bin nicht einverstanden. Die Referenzen spricht über die Callback-Manipulationsfunktionen (zB .error, .success) , die sich zugunsten des universellere Latente Muster veraltet, aber die Parameter an die ajaxMethode nicht veraltet und sind gültig und akzeptabel - auch in jQuery 1.9 / 2.0! ajaxGibt in allen aktuellen Formularen immer noch einen Zurückgestellten zurück. möglicherweise mit bereits angehängten verzögerten Rückrufen.
user2246674

1
Hier ist es, jQuery 1.9 und success:, error: und complete: sind weiterhin verwendbar. Meine Frage ist jedoch, ist .done () == zum Erfolg :?
TARKUS

3
@GregoryLewis Von JQuery 1.10 Quellcode : jqXHR.success = jqXHR.done;.
Michael Laffargue

9
Ich würde ehrlich bevorzugen success, fail, always.
Ahnbizcad

4
WOW, ich habe auch die Dokumentation falsch gelesen. Ich dachte buchstäblich, dass die Optionen 'Erfolg' / 'Fehler' für $ .ajax in 'erledigt / fehlgeschlagen' umgeschrieben wurden. Es waren nur die Callback-Methodenketten. Ehrlich gesagt denke ich, dass sie auch die Optionsnamen hätten wechseln sollen. Das hatte mich stundenlang verblüfft.
OzzyTheGiant

12

Ich möchte etwas zu @Michael Laffargues Beitrag hinzufügen:

jqXHR.done() ist schneller!

jqXHR.success()haben einige Ladezeit im Rückruf und können manchmal Skript übertreiben. Ich finde das schon mal schwer.

AKTUALISIEREN:

Verwenden Sie jqXHR.done(), jqXHR.fail()und jqXHR.always()Sie können besser mit Ajax-Anfrage bearbeiten. Im Allgemeinen können Sie Ajax in einer Variablen oder einem Objekt definieren und diese Variable oder dieses Objekt in einem beliebigen Teil Ihres Codes verwenden, um Daten schneller abzurufen. Gutes Beispiel:

/* Initialize some your AJAX function */
function call_ajax(attr){
    var settings=$.extend({
        call            : 'users',
        option          : 'list'
    }, attr );

    return $.ajax({
        type: "POST",
        url: "//exapmple.com//ajax.php",
        data: settings,
        cache : false
    });
}

/* .... Somewhere in your code ..... */

call_ajax({
    /* ... */
    id : 10,
    option : 'edit_user'
    change : {
          name : 'John Doe'
    }
    /* ... */
}).done(function(data){

    /* DO SOMETHING AWESOME */

});

9
Haben Sie glaubwürdige und überprüfbare Referenzen?
Paul Vargas

@PaulVargas Ich mache nie einen Leistungstest, aber in meiner Praxis finde ich, dass dies funktioniert. Sie können es selbst versuchen.
Ivijan Stefan Stipić

1
Bitte legen Sie alle vertrauenswürdigen Beweise vor.
Wonsuc

Wie Sie wissen, sind Rückruffunktionen langsamer als die Rückgabe einiger Objekte aus der Funktion. Manchmal ist die Auswirkung gering, aber manchmal kann sie sehr groß sein, wenn Sie viele Anrufe haben.
Ivijan Stefan Stipić

7

In einfachen Worten

$.ajax("info.txt").done(function(data) {
  alert(data);
}).fail(function(data){
  alert("Try again champ!");
});

Wenn es den info.text erhält, wird es alarmieren und welche Funktion Sie auch immer hinzufügen oder wenn es nicht möglich ist, info.text vom Server abzurufen, dann alarmiert oder fehlerhaft.


0

Wenn wir JQuery in unserer alten vorhandenen Anwendung von 1.x auf 2x oder 3.x migrieren, verwenden wir .done, .fail anstelle von success, error, da die JQuery-Up-Abstufung für diese Methoden veraltet sein wird Wenn wir beispielsweise Server-Webmethoden aufrufen, gibt der Server Versprechen-Objekte an die aufrufenden Methoden (Ajax-Methoden) zurück, und diese Versprechen-Objekte enthalten die Methoden .done, .fail..etc. Unten ist das Beispiel (es ist für POST-Anfragen genauso, wie wir es für einen Anfrage-Typ wie GET konstruieren können ...)

 $.ajax({
            type: "POST",
            url: url,
            data: '{"name" :"sheo"}',
            contentType: "application/json; charset=utf-8",
            async: false,
            cache: false
            }).done(function (Response) {
                  //do something when get response            })
           .fail(function (Response) {
                    //do something when any error occurs.
                });
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.