J'ai construit une application javascript qui a un graphique avec quelques filtres déroulants que les utilisateurs peuvent changer. Les listes déroulantes ont toutes des écouteurs d'événements qui soumettent une requête de serveur pour obtenir les données (via un appel jquery ajax), puis ils représentent graphiquement les données. Le problème est que l'utilisateur utilise le clavier pour parcourir rapidement de nombreux éléments différents de la liste déroulante. L'appel du serveur prend environ une seconde, donc s'ils défilent rapidement par 20, cela peut entraîner une accumulation. 20 demandes différentes au serveur sont créées, et il n'y a même pas de garantie que le dernier morceau de code à exécuter sur le serveur demande le succès sera le filtre le plus courant.Tuer des appels ajax si un nouveau est lancé
Donc, ma question est de savoir quelle est la meilleure façon quand un filtre est modifié pour tuer tous les autres processus asynchrones? Voici le code correspondant:
$("#filter").change(function(d) {
getData();
} //end of if
});
function getData() {
...
$.ajax({
url: myUrl
type: "GET",
dataType: "json",
success: function(d) {
[do some stuff]
} //end of success function
}); //end of ajax
} //end of getData
Vous avez une accolade supplémentaire dans cette première fonction, il dit qu'il ferme un 'if'. – AtheistP3ace
Vous devez attendre que la requête en cours d'exécution soit terminée avant d'en envoyer une nouvelle (et ignorer certaines requêtes qui pourraient se produire pendant que la requête en cours est en cours d'exécution). Même si vous utilisiez la fonctionnalité 'abort' de' XMLHttpRequest2', cela pourrait entraîner une charge de serveur trop élevée. –
Copie possible de [Annuler l'appel AJAX précédent lorsqu'un nouveau est fait?] (Https://stackoverflow.com/questions/9285271/abort-previous-ajax-call-when-a-new-one-made) –