jQuery jqXHR – verkettete Aufrufe abbrechen, Fehlerkette auslösen

Lesezeit: 3 Minuten

jQuery jqXHR verkettete Aufrufe abbrechen Fehlerkette auslosen
m0sa

Ich erstelle ein Ajax-Dienstprogramm für die Schnittstelle zu meinen Servermethoden. Ich möchte jQuery 1.5+ verzögerte Methoden aus dem Objekt nutzen, das vom Aufruf von jQuery.ajax() zurückgegeben wird. Die Situation ist folgende.

  1. Die serverseitige Methode gibt immer ein JSON-Objekt zurück:

    { success: true|false, data: ... }

  2. Das clientseitige Dienstprogramm initiiert den Ajax-Aufruf wie folgt

    var jqxhr = $.ajax({ ... });

  3. Und die Problemzone:

    jqxhr.success(function(data, textStatus, xhr) {
         if(!data || !data.success) { 
             ???? // abort processing, trigger error
         }
    });
    return jqxhr; // return to caller so he can attach his own handlers
    

Die Frage ist also, wie man den Aufruf aller an den Aufrufer angehängten Erfolgs-Callbacks abbricht und seinen Error-Handler an der genannten Stelle auslöst ???? ?

Die Dokumentation besagt, dass die Listen der verzögerten Funktionsaufrufe FIFO sind, also ist mein Erfolgshandler definitiv der erste.

jQuery jqXHR verkettete Aufrufe abbrechen Fehlerkette auslosen
bzw

(AKTUALISIEREN:
Bitte beachten Sie, dass derzeit jQuery Promises nicht mit dem kompatibel sind Versprechungen/A+ Spezifikation – Weitere Informationen in dieser Antwort.)

In Ihrer Funktion, in der Sie die AJAX-Anforderung erstellen, können Sie auch ein zurückgestelltes Objekt erstellen und dem Aufrufer ein Versprechen zurückgeben, nachdem Sie seine Auflösungs- und Ablehnungsfunktionen mit einer benutzerdefinierten Datenüberprüfung an die entsprechenden Rückrufe der $.ajax-Anforderung gebunden haben, wie folgt:

function makerequest() {

    var deferred = $.Deferred();
    var promise = deferred.promise();

    var jqxhr = $.ajax({
        // ...
    });

    jqxhr.success(function(data, status, xhr) {
        if (!data || !data.success) {
            deferred.reject(jqxhr, 'error');
        } else {
            deferred.resolve(data, status, xhr);
        }
    });

    jqxhr.error(function(jqXHR, status, error) {
        deferred.reject(jqXHR, status, error);
    });

    return promise;
}

Jetzt kann jeder es wie jedes Versprechen wie dieses für Ihre Funktion verwenden:

var request = makerequest();

request.done(successCallback);
request.fail(errorCallback);

Oder auch nur:

makerequest().then(successCallback, errorCallback);

Wenn Sie dies auch hinzufügen:

    promise.success = promise.done;
    promise.error = promise.fail;

dann hat Ihr Aufrufer eine (vielleicht vertrautere) Schnittstelle von .success() und .error() wie bei reinen $.ajax()-Aufrufen:

var request = makerequest();

request.success(successCallback);
request.error(errorCallback);

(Die Implementierung von .complete() bleibt dem Leser als Übung überlassen.)

Sehen Sie sich diese Demos an:

Hier ist ein weiteres Beispiel, das direkt aus einem Arbeitsprojekt gezogen wurde:

function ajax(url, data) {
    var self = this;
    var deferred = $.Deferred();
    var promise = deferred.promise();

    var jqxhr = $.ajax({
        url: url,
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        type: 'POST'
    }).done(function (msg, status, xhr) {
        if (!msg || msg.Error) {
            self.doError(msg.Error);
            deferred.reject(jqxhr, 'error');
        } else {
            deferred.resolve(msg, status, xhr);
        }
    });

    return promise;
}

  • BITTE BEACHTEN SIE: Diese Antwort datiert vom 11. Februar, zu diesem Zeitpunkt war jQuery v1.5. Nachfolgende Verbesserungen an jQuery machen diese Antwort überflüssig. Ab v1.6 wäre die allgemein akzeptierte Lösung beteiligt gewesen deferred.pipe() und ab v1.8 deferred.then(), an welcher Stelle wir so etwas schreiben würden wie function makerequest() { return jqxhr.then(function(data) { return (data && data.success) ? jqxhr : $.Deferred().reject(new Error('AJAX data error')).promise(); }); }.

    – Roamer-1888

    17. Juni 14 um 4:54 Uhr

  • Sobald wir anfangen, etwas nicht gleich zurückzugeben jqXHR (mögen $.Deferred().promise in der obigen Antwort), verlieren wir den Zugriff auf .abort() Funktion des Originals jqXHR Objekt und kann die Anfrage nicht mehr abbrechen, bevor sie aufgelöst wird, falls erforderlich.

    – Nik Sumeiko

    15. März 16 um 11:54 Uhr


.

525550cookie-checkjQuery jqXHR – verkettete Aufrufe abbrechen, Fehlerkette auslösen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy