jQuery ajax () mit Erfolg, Fehler und Vollständigkeit vs .done (), .fail () und always ()

75

Die Fragen :

  1. Sollten wir unsere Codierung wie unten vorgeschlagen ändern?
  2. Gibt es einen Unterschied zwischen .done()& success:, .fail()& error:und .always()& complete:?

Die Präambel :

Ich habe einen jQuery.ajax-Aufruf zusammengestellt, den ich auch in der Vergangenheit erfolgreich durchgeführt habe. Etwas wie das:

    $.ajax(
    {
        url: someUrl,
        type: 'POST',
        data: someData,
        datatype: 'json',
        success: function (data) { someSuccessFunction(data); },
        error: function (jqXHR, textStatus, errorThrown) { someErrorFunction(); }
    });

Bei einem kurzen Blick auf einige Dokumentationen stieß ich auf eine Referenz, die besagte, dass Erfolg, Fehler und vollständige Rückrufe ab jQuery 1.8 veraltet sind. Verwenden Sie stattdessen jqXHR.done (), jqXHR.fail () und jqXHR.always (), um Ihren Code für das eventuelle Entfernen vorzubereiten.

Wir sollten daher stattdessen so etwas programmieren:

$.ajax( "example.php" )
    .done(function (data) { someSuccessFunction(data); })
    .fail(function (jqXHR, textStatus, errorThrown) { someErrorFunction(); })
    .always(function() { alert("complete"); });
PostureOfLearning
quelle
1
Ich bevorzuge die zweite Methode ... bei der das von Ajax zurückgegebene Versprechen verwendet wird
Arun P Johny
8
Die Rückrufe sind nicht veraltet. Die zugehörigen Methoden für das jqxhr-Objekt sind.
Ich stimme Arun zu, auch ich denke, das ist persönlich leichter zu lesen
Rooster
1
Ich suche keine Kommentare und Aussagen zu Präferenzen, möchte aber die Unterschiede verstehen, falls es welche gibt.
PostureOfLearning
14
Für diejenigen, die nicht wissen, was jqxhr-Objekte sind, bedeutet Crazy Train "Die Rückrufe sind nicht veraltet. Die zugehörigen Methoden für das jqxhr-Objekt sind". ist, dass .done()ersetzt .success(), .fail()ersetzt .error()und .always()ersetzt .complete(). Die .success(), .error()und .complete() Methoden unterscheiden sich von den success, errorund complete Optionen für das .ajax()Verfahren.
Ahnbizcad

Antworten:

38

Nun, es gibt keinen Vorteil, dies in dieser speziellen Situation zu tun.

Der Punkt der .done() .fail() .always()Methoden ist, dass Sie können

  1. Fügen Sie mehrere Handler hinzu
  2. Tun Sie dies überall und nicht nur beim Anrufen $.ajax

Wenn Sie an der $.ajaxAnrufstelle nur einzelne Handler anschließen, kommen diese Vorteile nicht wirklich ins Spiel.

So können Sie das Versprechen zurückgeben und andere können ihre eigenen Handler anhängen.

Beispiel ist das Aktualisieren von Plugins nach einer Ajax-Anfrage:

$.ajaxPrefilter(function(opt, origOpt, jqxhr) {
    jqxhr.always(function() {
        $("[data-plugin]").plugin();
    });
});
Esailija
quelle
4
FYI - Nach den docs wie von jQuery 1.5 die complete, errorund successEinstellungen werden eine Reihe von Callback - Funktionen übernehmen, so dass Sie mehrere Handler anhängen können.
user9645
1
für # 2: wo sonst würden diese Methoden außer beim Aufrufen verwendet werden $.ajax()? Funktionieren diese Methoden nur auf jqxhr-Empfängern?
Ahnbizcad