2014-02-08 3 views
14

Ich habe ein Problem in Ajax-Funktion, wo der beforeSend des zweiten Ajax-Post vor der Fertigstellung ausgeführt wird: Funktion des ersten Ajax. Die Ladeklasse, die ich dem Platzierer vor dem Senden hinzufüge, arbeitet für den ersten Ajax-Aufruf. Sobald jedoch die erste Ajax-Anforderung abgeschlossen ist, wird die Klasse entfernt und wird bei den zweiten und weiteren Aufrufen nie wieder angehängt (erinnern Sie sich an rekursive Aufrufe). Während des Debuggens wird angezeigt, dass die beforeSend-Funktion der zweiten Ajax-Aufrufe zuerst aufgerufen wird und die vollständige Funktion des ersten Ajax-Aufrufs später aufgerufen wird. Was offensichtlich ist, weil die Rückdaten, die auf der Seite von dem ersten Ajax-Anruf eingefügt werden, den zweiten Anruf starten.Jquery Ajax beforeSend und Erfolg, Fehler und vollständig

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

Der Funktionscode ist 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 enthält die folgenden Ausschnitt von Javascript/jquery die überprüft, und beginnt eine andere Ajax-Request.

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

Antwort

37

Vielleicht können Sie 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' 
}); 
} 

diese Weise, wenn die beforeSend Anweisung vor der complete Anweisung aufgerufen, wenn i über 0 sein wird, so wird es nicht die Klasse entfernen. Dann kann nur der letzte Anruf es entfernen. Ich kann es nicht testen, lassen Sie mich wissen, ob es funktioniert oder nicht.

+0

Ich versuchte Ihre Lösung und es gab mir überraschende Ergebnisse. Zuerst habe ich die var requestNumber = 0 und ++ in vorSenden verwendet und es komplett/immer überprüft. Es zeigt die requestNumber == 2 und - Ergebnisse in 1, die in der Prüfung false zurückgibt und die Ladeklasse nicht entfernt wird. Es wird jedoch nie entfernt, weil ich nicht weiß, warum, es erzeugt eine zusätzliche Anforderung für die gesamte Sequenz. Jetzt ist der Täter gefunden, ich denke, es ist einfach zu lösen oder eine Bug-Anfrage zu posten. –

+0

Wenn die Funktion fehlschlägt, wird sowohl der Fehler als auch der Fehler angezeigt. Was, wenn ich es nur komplett haben möchte, kann ich am Ende des Vorgangs '1 zurückgeben', damit es nicht zu einem Fehler kommt? –

7

Es ist eigentlich viel einfacher, mit jQuery's promise API:

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

Alternativ können Sie in den bind Funktionen zu jedem Ergebnis Rückruf übergeben; Die Reihenfolge der Parameter lautet: (success, failure). Solange Sie eine Funktion mit mindestens einem Parameter angeben, erhalten Sie Zugriff auf die Antwort. So zum Beispiel, wenn Sie den Antworttext überprüfen möchten, können Sie einfach 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 
+0

Danke für das Update, ich aktualisierte meinen Code und ersetzte Erfolg, Fehler und komplette Rückruffunktionen mit den neu definierten, versprochenen Funktionen fehlgeschlagen, fertig und immer. Sie haben das Problem jedoch nicht gelöst, da das Problem etwas anders war, als ich die von @Nathan P bereitgestellte Lösung anwendete –

Verwandte Themen