Aufruf an jquery ajax - .fail vs.: error

76

Welches soll ich verwenden?

Gibt es einen Grund, das eine anstelle des anderen zu verwenden?

Ist man besser für die Fehlerbehandlung?

$.ajax({
    url: url,
    data: { start: start, end: end }
}).done(function(data, textStatus, jqXHR) {
    $('#myElement').append(data);
}).fail(function() {
    // report error    
});

ODER

$.ajax({
    url: url,
    data: { start: start, end: end },
    success: function(data, textStatus, jqXHR) {
        $('#myElement').append(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        // report error
    }
});
PeteGO
quelle

Antworten:

43

Die beiden Optionen sind gleichwertig.

Über die Schnittstelle ( .fail()und .done()) im Versprechungsstil können Sie jedoch den Code, der die Anforderung erstellt, vom Code trennen, der die Antwort verarbeitet.

Sie können eine Funktion schreiben, die eine AJAX-Anforderung sendet und das jqXHR-Objekt zurückgibt. Anschließend können Sie diese Funktion an einer anderen Stelle aufrufen und einen Handler hinzufügen.

In Kombination mit der .pipe()Funktion kann die Oberfläche im Versprechungsstil auch dazu beitragen, die Verschachtelung bei mehreren AJAX-Aufrufen zu reduzieren:

$.ajax(...)
    .pipe(function() { 
        return $.ajax(...);
    })
    .pipe(function() { 
        return $.ajax(...);
    })
    .pipe(function() { 
        return $.ajax(...);
    });
SLaks
quelle
34
"Ab jQuery 1.8 ist die Methode deferred.pipe () veraltet. Stattdessen sollte die Methode deferred.then () verwendet werden, die sie ersetzt." api.jquery.com/deferred.pipe
richardaday
31

Nur um das aufzufrischen ...

Der Erfolgs- und Fehleransatz wurde ab jQuery 1.8 verworfen.

jQuery Ajax

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

slohr
quelle
10
Dies ist eigentlich ein deprecation von error()auf dem jqXHRObjekt, nicht $.ajaxselbst, das ist das, was der Benutzer eingegeben werden .
Adam Grant
1
@AdamGrant, $.ajax gibt a zurück jqXHR, also ist @slohr korrekt.
Concrete Gannet
8
Du hast recht. Ich sollte meinen Kommentar umformulieren, die Ablehnung auf successund errornicht auf die Funktionen auf Objektebene anwenden, an die übergeben wurde$.ajax()
Adam Grant
2
Ich habe ein paar Stunden damit verbracht und ja, ich habe festgestellt, dass die Abwertung von Methoden und NICHT von den Optionen abhängt, an die Sie übergeben $.ajax().
adi518
3

Die Verwendung des verkettbaren Versprechungsstils für verzögerte Objekte ermöglicht eine sauberere Struktur und die Verwendung von Always .

let data = {"key":"value"}

$.ajax({
    type: 'PUT',
    url: 'http://example.com/api',
    contentType: 'application/json',
    data: JSON.stringify(data), 
}).done(function () {
    console.log('SUCCESS');
}).fail(function (msg) {
    console.log('FAIL');
}).always(function (msg) {
    console.log('ALWAYS');
});
ow3n
quelle