2010-03-17 2 views
4

J'ai un script de saisie semi-automatique javascript personnalisé qui frappe le serveur avec plusieurs requêtes ajax asynchrones. (Chaque fois qu'une touche est pressée.)Ignorer les anciennes requêtes ajax asynchrones multiples

J'ai remarqué que parfois une requête ajax antérieure sera retournée après une demande ultérieure, ce qui gâche les choses.

La façon dont je gère cela maintenant est que j'ai un compteur qui incrémente pour chaque requête ajax. Les demandes qui reviennent avec un nombre inférieur sont ignorées. Je me demande: est-ce correct? Ou y a-t-il une meilleure façon de traiter ce problème?

Merci à l'avance,

Travis

+1

Je pense que l'envoi d'une requête ajax chaque fois qu'une touche est pressée est une recette pour surcharger votre serveur lorsque vous avez deux utilisateurs simultanés. Essayez d'étrangler la chose en mettant en place un temporisateur afin que la demande ne soit envoyée que si aucune touche n'est pressée pendant une demi-seconde, alors vous obtiendrez seulement un coup lorsque l'utilisateur arrête de taper. Ce commentaire par exemple aurait pu créer 383 hits serveur ... – Karl

+0

@Karl, D'accord, mais cela pourrait encore être un problème. – strager

Répondre

8

Vous pouvez stocker un "global" currentAjaxRequest, qui détient la structure de la dernière requête XHR. Ensuite, vous pouvez abort la demande en cours lorsque vous en créez une nouvelle.

Par exemple:

var currentAjaxRequest = null; 

function autoCompleteStuff() { 
    if(currentAjaxRequest !== null) { 
     currentAjaxRequest.abort(); 
    } 

    currentAjaxRequest = $.get(..., function(...) { 
     currentAjaxRequest = null; 

     ... 
    }); 
} 

Pour éviter les conflits de noms, enveloppez que dans un anonyme, la fonction instantanément exécutée, si nécessaire.

Questions connexes