Frage

Ich habe eine Ajax -Seite aktualisiert mit dem Aktualisieren setInterval. Von Zeit zu Zeit ist der Server so langsam, dass eine neue Anfrage vorgenommen wird, bevor die vorherige abgeschlossen ist.

Wie kann ich das verhindern?

War es hilfreich?

Lösung

Verwenden Sie einen Zeitlimitwert, der kürzer als Ihr Aktualisierungsintervall ist. Wenn die Anfrage ausfällt, wird der Fehlerhandler aufgerufen, sodass Sie zwischen Auszeiten und anderen Arten von Fehlern im Handler unterscheiden müssen.

 $.ajax({
   type: "POST",
   url: "some.php",
   data: "name=John&location=Boston",
   timeout: 5000, /* ms or 5s */
   success: function(msg){
     alert( "Data Saved: " + msg );
   }
 });

Dokumente bei jQuery.com. Beispiel oben aus derselben Quelle, jedoch mit dem zusätzlichen Zeitlimitwert.

Andere Tipps

Verwenden Sie stattdessen SetTimeout und initiieren Sie einen anderen SetTimeout erst, nachdem Sie das Ergebnis der AJAX -Anforderung erhalten haben. Auf diese Weise erfolgt eine Aktualisierung erst nach dem angegebenen Zeitraum seit der letzten Aktualisierung.

Anstatt ein festes, hartcodiertes Intervall zu verwenden: Trigger die nächste Aktualisierung als letzter Schritt bei der Umarbeitung des aktuellen, z.

Sie können eine Variable hinzufügen, die den Zeitpunkt des Versendens der aktuellen Anfrage verfolgt, damit Sie eine dynamische Verzögerung berechnen können:

  1. Nehmen Sie die aktuelle Zeit T1
  2. Senden Sie eine asynchrone Anfrage
  3. Andere Sachen passiert ...
  4. Asynchrone Anfragen Rückgaben, Callback wird ausgeführt
  5. Subtrahieren Sie T1 von der aktuellen Zeit
  6. Wenn Ergebnis <Ihr gewünschtes Anfrageintervall, setzen Sie den Verzögerungswert> 0
  7. Wenn Ergebnis> = Ihr gewünschtes Anforderungsintervall, setzen Sie den Verzögerungswert = 0
  8. Rufen Sie SetTimeout mit dem Verzögerungswert auf und initiieren Sie den nächsten Zyklus

Was ich Ihnen sagen kann, ist, dass Sie ein Flag in Ihrem Code verwenden. Gefällt mir (nicht das, was ich tatsächlich nur ein einfaches Beispiel empfehle)

var isWorking = false;
function doRequest(){
  if(isWorking) return;
  isWorking = true;
  $.ajax({
    ...,
    success: workWithResponse
  });
}

function workWithResponse(){
  /* doAnythingelse */
  isWorking = false;
}

setInterval(doRequest,1000);

So etwas, es ist primitiv, aber Sie werden Rassenbedingungen vermeiden. Grüße.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top