8
votes

Comment faire des appels Ajax à intervalles sans chevauchement?

Je cherche à configurer une page Web qui échantillonne des données via Ajax appels à partir d'un serveur Web intégré. Comment configurer le code afin qu'une demande ne se chevauche pas une autre? Je devrais mentionner que j'ai très peu d'expérience JavaScript et une raison convaincante de ne pas utiliser de bibliothèques externes de toutes tailles plus grandes que 10 ou plus de kilobytes.


1 commentaires

Bienvenue sur Stackoverflow. Bonne première question.


3 Réponses :


1
votes

Ajax, malgré le nom, il n'est pas nécessaire de ne pas être asynchrone.

Voici la méthode asynchrone ... xxx

... mais voici un équivalent synchrone. .. xxx

... et voici une action typique ... xxx


1 commentaires

Les demandes synchrones ne sont pas vraiment la meilleure idée, à mon avis, ils enferment le reste de la page ... mais cela dépend des exigences de l'utilisateur. De plus, de JQuery $ .AJAX DOCS: "Il est préférable de bloquer l'interaction utilisateur par d'autres moyens lorsque la synchronisation est nécessaire."



1
votes

Je vous suggère d'utiliser une petite boîte à outils comme JX.JS ( source ). Vous pouvez le trouver ici: http://www.openjs.com/scripts/jx/ (moins de 1k minifiée)

Pour configurer une requête: p> xxx pré>

Pour la configurer sur un intervalle, vous pouvez utiliser setInterval code> et a Variable pour stocker si une demande se produit ou non - si c'est le cas, nous ne faisons rien: P>

var activeRequest = false;
setInterval(function(){

    if (!activeRequest) {
        // Only runs if no request is currently occuring:
        jx.load('somepage.php', function(data){
            activeRequest = false;
            alert(data); // Do what you want with the 'data' variable.
        });
    }
    activeRequest = true;

}, 5000); // Every five seconds


2 commentaires

Identique que l'autre réponse ... Alors, pourquoi gaspiller l'intervalle, mais simplement faire des appels synchrones. Vous allez en moyenne 5000ms / 2 par interrogation.


J'ai votre réponse. Il peut réduire le chevauchement et réduire la charge du serveur. +



6
votes

Vous voudrez peut-être envisager la possibilité de relancer votre demande Ajax uniquement après une réponse réussie de l'appel AJAX précédent. xxx

Cet exemple utilise ExtJS , mais vous pouvez utiliser très facilement juste Xmlhttprequest .

Note: Si vous devez avoir un intervalle exact de x secondes, vous devriez garder une trace du temps passé À partir de laquelle la demande AJAX a été lancée jusqu'au Settimeout () appelez, puis soustrayez cette période de temps du délai. Sinon, l'heure d'intervalle de l'exemple ci-dessus varie en fonction de la latence de réseau et du temps nécessaire pour traiter la logique de service Web.


2 commentaires

Pas exactement ce qu'ils demandaient, mais une très bonne solution (juste pour utiliser des rappels)


Bonne réponse. Cependant, vous voulez probablement SETTimeOut après que les appels AJAX précédents sont effectués, que cela soit réussi ou non. Sinon, la première fois que vous avez un délai d'attente ou une erreur, vous arrêterez de recevoir des mises à jour.