Le séquençage des requêtes ajax
Je trouve que j'ai parfois besoin d'itérer certains de collecte et de faire un appel ajax pour chaque élément. Je veux que chaque appel de retour avant de passer à l'élément suivant de sorte que je ne pas faire sauter le serveur avec des requêtes qui conduit souvent à d'autres questions. Et je ne veux pas définir asynchrone de faux et de figer le navigateur.
Habituellement, cela implique de mettre en place une sorte de itérateur contexte que j'ai pas à pas sur chaque succès de rappel. Je pense qu'il doit être plus propre, plus simple?
Quelqu'un aurait-il une conception intelligente modèle pour la façon de les parfaitement le travail à travers une collection de faire des appels ajax pour chaque élément?
- Le temps et la marée de mars (comme @gnarf revint et souligné) ... que de 1,5 jQuery a toute une série de
Deferred
objets, y compriswhen()
qui sont grands pour cette situation. Voir : api.jquery.com/category/deferred-object et api.jquery.com/jQuery.when
Vous devez vous connecter pour publier un commentaire.
jQuery 1.5+
J'ai développé une
$.ajaxQueue()
plugin qui utilise le$.Différés
,.file()
, et$.ajax()
aussi de passer de nouveau un promesse qui est résolu lorsque la requête est terminée.jQuery 1.4
Si vous êtes à l'aide de jQuery 1.4, vous pouvez profiter de l'animation de la file d'attente sur un objet vide pour créer votre propre "file d'attente" pour vos requêtes ajax pour les éléments.
Vous pouvez même facteur dans votre propre
$.ajax()
de remplacement. Ce plugin$.ajaxQueue()
utilise la norme de " fx " de la file d'attente pour jQuery, qui démarre automatiquement le premier élément ajouté si la file d'attente n'est pas déjà en cours d'exécution.Exemple D'Utilisation
Donc, nous avons un
<ul id="items">
qui a quelques<li>
que nous voulons copier (à l'aide d'ajax!) à la<ul id="output">
jsfiddle de démonstration - Version 1.4
oldComplete
est différent pour chaque appel à$.ajaxQueue()
.pipe()
le dernier exemple sur les docs couvre que le scénario.abort()
sur la demande, la même chose que vous vous fixez le.done
tropUn moyen rapide et petite solution à l'aide de différé promesses. Même si ce utilise jQuery
$.Deferred
, toutes les autres doivent faire.D'utilisation, appelez-la pour créer de nouvelles files d'attente:
Voir l'exemple avec un side-by-side de comparaison de requêtes asynchrones.
Vous pouvez envelopper tous que la complexité en fonction pour faire un simple appel qui ressemble à ceci:
Ci-dessous est un croquis (exemple de travail, à l'exception de l'appel ajax). Ceci peut être modifié pour utiliser une file d'attente-comme la structure au lieu d'un tableau
Idéalement, une coroutine avec de multiples points d'entrée de sorte que chaque rappel de serveur peut appeler le même coroutine sera soigné. Merde, c'est sur le point d'être mis en œuvre en Javascript 1.7.
De me laisser tenter à l'aide de la fermeture...
Ouais, tandis que les autres réponses, elles sont beaucoup de code et désordonné. Frame.js a été conçu pour élégamment remédier à cette situation. https://github.com/bishopZ/Frame.js
Par exemple, ce sera la cause de la plupart des navigateurs pour bloquer:
Bien que ce ne sera pas:
Aussi, en utilisant le Cadre vous permet de chute d'eau de la réponse des objets et de les traiter tous, après l'intégralité de la série de la requête AJAX ont terminé (si vous voulez):
Je suis de poster cette réponse en pensant que cela pourrait aider d'autres personnes à l'avenir, à la recherche de quelques solutions simples dans le même scénario.
C'est maintenant possible également d'utiliser le native promesse introduit dans l'ES6. Vous pouvez placer l'appel ajax dans une promesse et de le retourner au gestionnaire de l'élément.
Maintenant appeler la fonction de manière récursive, d'où vous avez la collecte des éléments.
- Je utiliser http://developer.yahoo.com/yui/3/io/#queue pour obtenir cette fonctionnalité.
Les seules solutions que je peux venir avec est, comme vous le dites, le maintien d'une liste d'attente des appels et de rappels. Ou de nidification le prochain appel dans le précédent rappel, mais qui se sent un peu en désordre.
Vous pouvez obtenir la même chose en utilisant
then
.http://plnkr.co/edit/meHQHU48zLTZZHMCtIHm?p=preview
Je dirais même un peu plus sophistiqué de l'approche qui est réutilisable pour les différents cas.
Je l'utilise pour l'exemple, quand j'ai besoin de ralentir une séquence d'appel lorsque l'utilisateur tape dans l'éditeur de texte.
Mais je suis sûr que ça devrait aussi fonctionner lors d'une itération à travers la collection. Dans ce cas, on peut la file d'attente de demandes, et peut envoyer un seul appel AJAX au lieu de 12.