Comment faire attendre une fonction jusqu'à ce que toutes les requêtes jQuery Ajax soient effectuées dans une autre fonction?
En bref, je dois attendre que toutes les requêtes Ajax soient effectuées avant d'exécuter la suivante. Mais comment?
javascript
jquery
ajax
jamietelin
la source
la source
Réponses:
jQuery définit désormais une fonction when à cet effet.
Il accepte un nombre illimité d'objets différés comme arguments et exécute une fonction lorsque tous se résolvent.
Cela signifie que si vous souhaitez lancer (par exemple) quatre requêtes ajax, puis effectuer une action une fois qu'elles sont terminées, vous pouvez faire quelque chose comme ceci:
À mon avis, cela permet une syntaxe claire et claire, et évite d'impliquer des variables globales telles que ajaxStart et ajaxStop, qui pourraient avoir des effets secondaires indésirables lors du développement de votre page.
Si vous ne savez pas à l'avance combien d'arguments ajax vous devez attendre (c'est-à-dire que vous voulez utiliser un nombre variable d'arguments), cela peut toujours être fait mais c'est juste un peu plus compliqué. Voir Passer dans un tableau de différés à $ .when () (et peut-être jQuery .when lors du dépannage avec un nombre variable d'arguments ).
Si vous avez besoin d'un contrôle plus approfondi sur les modes de défaillance des scripts ajax, etc., vous pouvez enregistrer l'objet renvoyé par
.when()
- c'est un objet jQuery Promise englobant toutes les requêtes ajax d'origine. Vous pouvez appeler.then()
ou.fail()
dessus pour ajouter des gestionnaires de réussite / échec détaillés.la source
$.when
renvoie unPromise
objet qui a des méthodes plus utiles, non seulement.done
. Par exemple, avec la.then(onSuccess, onFailure)
méthode, vous pouvez réagir lorsque les deux demandes aboutissent ou au moins l'une d'entre elles échoue.fail
cas. Contrairement àdone
,fail
tire immédiatement sur le premier échec et ne tient pas compte des différés restants.onFailure
fonction pouvait être attachée. Comme je l'ai souligné dans un commentaire à la question du PO: il voudra peut-être indiquer plus précisément ce qu'il entendait par "fait". "Ryan Mohr" avait également un très bon point concernant le fait qu'ilfail
se comporte différemment cardone
, quelques lectures supplémentaires à faire surPromises
je suppose que html5rocks.com/en/tutorials/es6/promisesSi vous voulez savoir quand toutes les
ajax
demandes sont terminées dans votre document, quel que soit leur nombre, utilisez simplement l' événement $ .ajaxStop de cette façon:Mise à jour:
si vous souhaitez vous en tenir à la
ES
syntaxe, vous pouvez utiliser Promise.all pour lesajax
méthodes connues :Un point intéressant ici est qu'il fonctionne à la fois avec
Promises
et avec les$.ajax
requêtes.Voici la démonstration de jsFiddle .
Mise à jour 2:
version encore plus récente utilisant la syntaxe async / wait :
la source
J'ai trouvé une bonne réponse par gnarf mon auto qui est exactement ce que je cherchais :)
jQuery ajaxQueue
Ensuite, vous pouvez ajouter une demande ajax à la file d'attente comme ceci:
la source
Utilisez l'
ajaxStop
événement.Par exemple, supposons que vous ayez un message de chargement ... lors de la récupération de 100 demandes ajax et que vous souhaitiez masquer ce message une fois chargé.
Depuis le doc jQuery :
Notez qu'il attendra que toutes les requêtes ajax soient effectuées sur cette page.
la source
REMARQUE: les réponses ci-dessus utilisent des fonctionnalités qui n'existaient pas au moment où cette réponse a été écrite. Je recommande d'utiliser à la
jQuery.when()
place de ces approches, mais je laisse la réponse à des fins historiques.-
Vous pourriez probablement vous en tirer avec un simple sémaphore de comptage, bien que la façon dont vous l'implémentiez dépendrait de votre code. Un exemple simple serait quelque chose comme ...
Si vous vouliez que cela fonctionne comme {async: false} mais que vous ne vouliez pas verrouiller le navigateur, vous pourriez accomplir la même chose avec une file d'attente jQuery.
la source
.get()
. De cette façon, au moins, vous ne dupliquez pas ce code. Non seulement cela, mais déclarer un àfunction(){}
chaque fois alloue de la mémoire à chaque fois! Plutôt mauvaise pratique si vous pouviez appeler une fonction définie statiquement.javascript est basé sur les événements, vous ne devez donc jamais attendre , plutôt définir des hooks / rappels
Vous pouvez probablement simplement utiliser les méthodes succès / complet de jquery.ajax
Ou vous pouvez utiliser .ajaxComplete :
bien que vous devriez publier un pseudocode de la façon dont votre (vos) demande (s) ajax est (sont) appelée (s) pour être plus précis ...
la source
Une petite solution de contournement est quelque chose comme ceci:
L'espoir peut être utile ...
la source
jQuery vous permet de spécifier si vous souhaitez que la demande ajax soit asynchrone ou non. Vous pouvez simplement rendre les requêtes ajax synchrones, puis le reste du code ne s'exécutera pas avant leur retour.
Par exemple:
la source
Si vous avez besoin de quelque chose de simple; rappel terminé
la source
Vous pouvez également utiliser async.js .
Je pense que c'est mieux que $ .when parce que vous pouvez fusionner toutes sortes d'appels asynchrones qui ne prennent pas en charge les promesses prêtes à l'emploi comme les délais d'attente, les appels SqlLite, etc. et pas seulement les demandes ajax.
la source
Sur la base de la réponse @BBonifield, j'ai écrit une fonction utilitaire pour que la logique sémaphore ne se répande pas dans tous les appels ajax.
untilAjax
est la fonction utilitaire qui appelle une fonction de rappel lorsque tous les ajaxCalls sont terminés.ajaxObjs
est un tableau d'objets de réglage ajax[http://api.jquery.com/jQuery.ajax/]
.fn
est la fonction de rappelExemple:
doSomething
fonction utiliseuntilAjax
.la source
Je recommande fortement d'utiliser $ .when () si vous partez de zéro.
Même si cette question a plus de millions de réponses, je n'ai toujours rien trouvé d'utile pour mon cas. Disons que vous devez gérer une base de code existante, faire déjà des appels ajax et ne pas vouloir introduire la complexité des promesses et / ou refaire le tout.
Nous pouvons facilement profiter de jQuery
.data
,.on
et.trigger
les fonctions qui ont été une partie de jQuery depuis toujours.Codepen
Le bon côté de ma solution est:
il est évident de quoi dépend exactement le rappel
la fonction
triggerNowOrOnLoaded
ne se soucie pas si les données ont déjà été chargées ou si nous l'attendons toujoursil est super facile de le brancher sur un code existant
la source
J'utilise la vérification de la taille lorsque toute la charge ajax est terminée
la source
Pour développer la réponse d'Alex, j'ai un exemple avec des arguments et des promesses variables. Je voulais charger des images via ajax et les afficher sur la page après qu'elles soient toutes chargées.
Pour ce faire, j'ai utilisé ce qui suit:
Mis à jour pour fonctionner pour des URL simples ou multiples: https://jsfiddle.net/euypj5w9/
la source
Comme d'autres réponses mentionnées, vous pouvez utiliser
ajaxStop()
pour attendre que toutes les demandes ajax soient terminées.Si vous voulez le faire pour une
ajax()
demande spécifique, le mieux que vous puissiez faire est d'utiliser lacomplete()
méthode à l'intérieur de la certaine demande ajax:Mais, si vous devez attendre seulement quelques demandes ajax et certaines à faire? Utilisez les merveilleuses promesses de javascript pour attendre que ces ajax que vous voulez attendre soient terminés. J'ai fait un exemple bref, facile et lisible pour vous montrer comment fonctionne les promesses avec ajax.
Veuillez jeter un œil à l'exemple suivant . J'avais l'habitude
setTimeout
de clarifier l'exemple.la source
J'ai trouvé un moyen simple, en utilisant
shift()
la source
Ma solution est la suivante
A très bien fonctionné. J'ai essayé de nombreuses façons différentes de le faire, mais j'ai trouvé que c'était le plus simple et le plus réutilisable. J'espère que cela aide
la source
Regardez ma solution:
1.Insérez cette fonction (et variable) dans votre fichier javascript:
Construisez un tableau avec vos demandes, comme ceci:
3.Créer une fonction de rappel:
4.Appelez la fonction runFunctionQueue avec les paramètres:
la source
$.when
ne fonctionne pas pour moi,callback(x)
au lieu dereturn x
travailler comme décrit ici: https://stackoverflow.com/a/13455253/10357604la source
Essayez de cette façon. faire une boucle à l'intérieur de la fonction de script java pour attendre la fin de l'appel ajax.
la source
setTimeout()
n'est PAS le castake a sleep
. Dans ce cas, il vous suffit de bloquer tous les onglets jusqu'à ce qu'ildone
devienne vrai.done
ce ne sera jamais vrai tant que la boucle while est toujours en cours d'exécution. Si la boucle while est en cours d'exécution, la boucle d'événement ne peut pas continuer et ne lancera donc jamais le rappel vers le succès ajax.