Jquery Ajax beforeSend und Erfolg, Fehler & vollständig

Lesezeit: 3 Minuten

Jquery Ajax beforeSend und Erfolg Fehler vollstandig
Rehan Anis

Ich habe ein Problem mit mehreren Ajax-Funktionen, bei denen die beforeSend des Sekunde ajax post wird vor dem ausgeführt complete Funktion der Erste ajax.

Die Ladeklasse, die ich vor dem Senden zum Platzhalter hinzufüge, funktioniert für den ersten Ajax-Aufruf. Kurz nachdem die erste Ajax-Anforderung abgeschlossen ist, wird die Klasse jedoch entfernt und beim zweiten und weiteren Aufrufen nie wieder angehängt (denken Sie an rekursive Aufrufe).

Beim Debuggen zeigt es, dass die beforeSend Funktion des zweiten Ajax-Aufrufs wird zuerst aufgerufen und die complete Funktion des ersten Ajax-Aufrufs wird später aufgerufen. Was offensichtlich ist, da die vom ersten Ajax-Aufruf in die Seite eingefügten Rückgabedaten den zweiten Aufruf starten.

Kurz gesagt, es ist durcheinander. Gibt es eine Möglichkeit, dies zu klären?

Der Funktionscode lautet wie folgt

function AjaxSendForm(url, placeholder, form, append) {
var data = $(form).serialize();
append = (append === undefined ? false : true); // whatever, it will evaluate to true or false only
$.ajax({
    type: 'POST',
    url: url,
    data: data,
    beforeSend: function() {
        // setting a timeout
        $(placeholder).addClass('loading');
    },
    success: function(data) {
        if (append) {
            $(placeholder).append(data);
        } else {
            $(placeholder).html(data);
        }
    },
    error: function(xhr) { // if error occured
        alert("Error occured.please try again");
        $(placeholder).append(xhr.statusText + xhr.responseText);
        $(placeholder).removeClass('loading');
    },
    complete: function() {
        $(placeholder).removeClass('loading');
    },
    dataType: 'html'
});
}

Und die Daten enthalten das folgende Snippet von Javascript/Jquery, das eine weitere Ajax-Anfrage prüft und startet.

<script type="text/javascript">//<!--
 $(document).ready(function() {
    $('#restart').val(-1)
    $('#ajaxSubmit').click();
});
//--></script>

Jquery Ajax beforeSend und Erfolg Fehler vollstandig
Serge K.

Vielleicht kannst du folgendes versuchen:

var i = 0;
function AjaxSendForm(url, placeholder, form, append) {
var data = $(form).serialize();
append = (append === undefined ? false : true); // whatever, it will evaluate to true or false only
$.ajax({
    type: 'POST',
    url: url,
    data: data,
    beforeSend: function() {
        // setting a timeout
        $(placeholder).addClass('loading');
        i++;
    },
    success: function(data) {
        if (append) {
            $(placeholder).append(data);
        } else {
            $(placeholder).html(data);
        }
    },
    error: function(xhr) { // if error occured
        alert("Error occured.please try again");
        $(placeholder).append(xhr.statusText + xhr.responseText);
        $(placeholder).removeClass('loading');
    },
    complete: function() {
        i--;
        if (i <= 0) {
            $(placeholder).removeClass('loading');
        }
    },
    dataType: 'html'
});
}

Auf diese Weise, wenn die beforeSend -Anweisung wird vor dem aufgerufen complete Aussage i größer als 0 sein, sodass die Klasse nicht entfernt wird. Dann kann nur der letzte Anruf es entfernen.

Ich kann es nicht testen, lass mich wissen, ob es funktioniert oder nicht.

  • Ich habe Ihre Lösung ausprobiert und sie hat mir überraschende Ergebnisse gebracht. Zuerst habe ich die var requestNumber = 0 und ++ in beforeSend verwendet und vollständig/immer eingecheckt. Es zeigt die Anforderungsnummer == 2 und — ergibt 1, was in der Prüfung “false” zurückgibt, und die Ladeklasse wird nicht entfernt. Es wird jedoch nie entfernt, weil ich nicht weiß warum, es generiert eine zusätzliche Anfrage für die gesamte Sequenz. Jetzt ist der Übeltäter gefunden, ich denke, es ist einfach, eine Fehleranfrage zu lösen oder zu posten.

    – Rehan Anis

    6. September 2014 um 7:23 Uhr

  • Wenn die Funktion fehlschlägt, geht sie sowohl auf Fehler als auch auf Abgeschlossen. Was ist, wenn ich es nur komplett haben will, kann ich return 1 am Ende abgeschlossen, damit es nicht zu Fehlern kommt?

    – Roboterjunge

    24. Juni 2015 um 6:12 Uhr

Es ist eigentlich viel einfacher mit Die Promise-API von jQuery:

$.ajax(
            type: "GET",
            url: requestURL,
        ).then((success) =>
            console.dir(success)
        ).failure((failureResponse) =>
            console.dir(failureResponse)
        )

Alternativ können Sie auch übergeben bind Funktionen zu jedem Ergebnisrückruf; Die Reihenfolge der Parameter ist: (success, failure). Solange Sie eine Funktion mit mindestens 1 Parameter angeben, erhalten Sie Zugriff auf die Antwort. Wenn Sie also beispielsweise den Antworttext überprüfen möchten, können Sie einfach Folgendes tun:

$.ajax(
            type: "GET",
            url: @get("url") + "logout",
            beforeSend: (xhr) -> xhr.setRequestHeader("token", currentToken)
        ).failure((response) -> console.log "Request was unauthorized" if response.status is 401

  • Danke für das Update, ich habe meinen Code aktualisiert und Success-, Error- und Complete-Callback-Funktionen durch die neu definierten, versprochenen Funktionen Fail, Done und Always ersetzt. Sie haben das Problem jedoch nicht gelöst, da das Problem etwas anderes war, als ich die von @Nathan P bereitgestellte Lösung anwendete

    – Rehan Anis

    6. September 2014 um 7:19 Uhr


842830cookie-checkJquery Ajax beforeSend und Erfolg, Fehler & vollständig

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

Privacy policy