jQuery: intervalle de retard de la fonction ajax jusqu'à exécution précédente est terminée

StackOverflow https://stackoverflow.com/questions/509007

Question

J'ai mis en place une page AJAX rafraîchir avec setInterval . De temps en temps, le serveur est si lent qu'une nouvelle demande est lancée avant que la précédente est terminée.

Comment puis-je empêcher cela?

Était-ce utile?

La solution

Utilisez une valeur de délai d'attente est plus courte que votre intervalle de rafraîchissement. Lorsque les temps de demande sur, il appellera le gestionnaire d'erreurs de sorte que vous aurez besoin de faire la différence entre le temps des erreurs et d'autres types d'erreurs dans le gestionnaire.

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

Docs à jquery.com. Exemple ci-dessus de même source, mais avec une valeur de dépassement de temps supplémentaire.

Autres conseils

Utilisez setTimeout à la place, lancer une autre setTimeout seulement après avoir reçu le résultat de la requête AJAX. De cette façon, un rafraîchissement se produit seulement après la période spécifiée depuis la dernière actualisation.

Au lieu d'utiliser un fixe, l'intervalle codé en dur: déclencher la prochaine actualisation en tant que dernière étape de manipulation de l'actuel, par exemple, dans le "succès" (ou "Complete") callbacks événement.

Vous pouvez ajouter une variable qui garde la trace du moment où la demande actuelle a été envoyé, de sorte que vous pouvez calculer un retard dynamique:

  1. prendre le temps courant T1
  2. envoyer requête asynchrone
  3. d'autres choses qui se passe ...
  4. retourne requête asynchrone, exécute de rappel
  5. T1 soustraire de l'heure
  6. si le résultat 0
  7. si le résultat> = votre intervalle de demande souhaité, définissez la valeur de retard = 0
  8. appel setTimeout avec la valeur de retard, le lancement du cycle suivant

Ce que je peux vous dire, utilisez un drapeau dans votre code. Comme (pas ce que je recommande en fait juste un exemple simple)

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

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

setInterval(doRequest,1000);

Quelque chose comme ça, sa primitive, mais vous éviterez des conditions de course. Cordialement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top