2010-08-06 5 views
2

J'ai un tableau de données (arrData) que je boucle autour (10 éléments), en appelant une requête ajax sur chacun. À l'heure actuelle, chaque appel ajax est fait en parallèle. Cela signifie que le serveur reçoit 10 appels en une seule fois et renvoie les données dans l'ordre dans lequel il les calcule. Pour soulager légèrement le serveur, je veux maintenant mettre en file d'attente mes appels. Par conséquent, lorsqu'un ensemble de données est reçu par ajax, il appelle la recherche suivante. Y a-t-il un moyen de faire cela intégré à jquery ou devrais-je pirater ma boucle et ajouter un rappel récursif à chacun?Existe-t-il un moyen de forcer un ensemble d'appels jquery ajax dans une file d'attente?

$.each(arrData, function(k,v) { 
    $.getJSON(lookupPath, 
     { key:k, val:v }, 
     function(data) { 
      console.log(data); //loopback here? 
     } 
    ); 
}); 

MISE À JOUR: Je suis allé avec les éléments suivants (comme suggéré par Scott M.) pour y parvenir:

function doLookup() { 
    if(k < arrData.length) { 
     var v = arrData[k]; 
     $.getJSON(lookupPath, 
      { key:k, val:v }, 
      function(data) { 
       console.log(data); 
       k++; 
       doLookup(); 
      } 
     ); 
    } 
} 

var k = 0; 
doLookup(); 
+0

Effectuez-vous un ajax onload? J'ai toujours l'impression que faire ça est une mauvaise chose. Voir: http://stackoverflow.com/questions/834751/isnt-ajax-on-pageload-a-bad-thing Juste parce que vous avez ajax disponible, ne signifie pas nécessairement que vous devriez l'utiliser. –

+0

Non, je fais mon appel ajax sur la soumission de formulaire. L'utilisateur tape le mot, ajax recherche la disponibilité des mots (et 10 phrases similaires) dans la base de données. Le premier résultat est le plus applicable, donc je veux que l'utilisateur puisse agir sur un résultat alors que d'autres sont en train de charger. –

Répondre

3

vous pourriez peut-être factoriser votre code côté serveur afin qu'il puisse accepter une demande et fournir une réponse à toutes les données dont vous avez besoin. Cela vous permettrait de traiter vos données de manière séquentielle et dans un seul thread.

EDIT:

En réponse au commentaire ci-dessous:

si vous avez besoin absolument les appels à être séquentielle, alors vous aurez besoin d'appeler la méthode récursive getJSON(). Cela garantira que vos requêtes AJAX sont séparées et en ordre.

+0

Cela semble une bonne solution pour moi. Le seul problème que j'ai avec cela est que je veux être capable de voir chaque résultat sur la page afin qu'un utilisateur puisse voir le résultat avant que le suivant ne soit ramené. Votre chemin, tout en étant plus gentil avec le serveur, ramènerait toutes les données à la fois avec un délai plus long avant que quelque chose ne soit affiché. –

-3

ajax jQuery a une option pour activer le mode synchrone ou non.

$.ajax({async: false}); 

http://api.jquery.com/jQuery.ajax/

+0

Il existe une différence énorme entre la mise en file d'attente des requêtes AJAX et leur synchronisation. Les requêtes synchrones verrouillent le navigateur pendant que les requêtes sont en cours. – Matt

+0

cela fait bloquer le navigateur et attendre que l'appel revienne avant de continuer –

+0

Ah, je n'étais pas au courant du problème de verrouillage. Je n'ai jamais rencontré ce problème moi-même, donc je n'ai jamais eu besoin de l'utiliser auparavant. Merci d'avoir signalé cela Matt, Scott M. –

0

Je ne pense pas qu'il existe un moyen de le faire dans jQuery out of the box. Il semble que vous allez devoir créer une fonction de rappel sur le succès de l'appel Ajax et l'exécuter pour chaque élément de votre tableau.

Questions connexes