Attendez jusqu'à ce que tous jQuery Ajax demande?
Comment puis-je faire une fonction d'attendre jusqu'à ce que tous Ajax de jQuery demandes sont fait à l'intérieur d'une autre fonction?
En bref, j'ai besoin d'attendre que toutes les requêtes Ajax pour être fait avant, j'ai exécuter la prochaine. Mais comment?
- Comment faites-vous appel à votre origine des requêtes ajax?
- Qu'entendez-vous par "fait" ? Je comprends bien que "toutes les demandes ont terminé avec succès ou pas" (résolu ou non). Mais vous pouvez dire "toutes les demandes ont terminé avec succès" (résolu). voir toutes les variations de la api.jquery.com/category/deferred-object
Vous devez vous connecter pour publier un commentaire.
jQuery définit maintenant une lorsque la fonction à cette fin.
Il accepte n'importe quel nombre de droits Différés à des objets comme arguments, et l'exécution d'une fonction lorsque tous d'entre eux à résoudre.
Cela signifie que, si vous voulez lancer (par exemple) quatre requêtes ajax, puis effectuer une action lorsque ils sont en fait, vous pourriez faire quelque chose comme ceci:
À mon avis, il en fait une claire et propre syntaxe, et évite impliquant toutes les variables globales telles que ajaxStart et ajaxStop, ce qui pourrait avoir des effets secondaires indésirables de votre page se développe.
Si vous ne savez pas à l'avance combien d'ajax arguments que vous avez besoin d'attendre pour (vous voulez utiliser un nombre variable d'arguments), il peut encore être fait, mais il est un peu plus embêtant. Voir Un tableau de Deferreds de $.lorsque() (et peut-être jQuery .lors du dépannage avec un nombre variable d'arguments).
Si vous avez besoin plus profond de contrôle sur les modes de défaillance de l'ajax scripts etc., vous pouvez économiser de l'objet renvoyé par
.when()
- c'est un jQuery Promesse objet englobant tous les originaux des requêtes ajax. Vous pouvez appeler.then()
ou.fail()
pour ajouter des détails à la réussite/l'échec des gestionnaires.$.when
renvoie unePromise
objet qui a le plus de méthodes utiles, non seulement.done
. Par exemple, avec.then(onSuccess, onFailure)
méthode vous pourrez réagir lorsque les deux demandes de réussir ou au moins l'un d'entre eux tombe en panne.fail
cas. Contrairement àdone
,fail
déclenche immédiatement sur défaillance de la première et néglige le reste deferreds.onFailure
fonction pourrait être fixé. Comme je l'ai souligné dans un commentaire à l'OP à la question: il pourrait vouloir indiquer plus précisément ce qu'il entend par "fait". "Ryan Mohr" n'ont également un très bon point concernant le fait que l'fail
se comporte différemment quedone
, certains autres lectures à faire à propos dePromises
je suppose que html5rocks.com/en/tutorials/es6/promisesSi vous voulez attendre jusqu'à ce que toutes les requêtes ajax sont finis dans votre document, n'importe comment beaucoup d'entre eux existent, il suffit d'utiliser
$.ajaxStop
événement de cette façon:Dans ce cas, il n'y a pas besoin de deviner combien de demandes peut être dans une application qui pourrait finir dans l'avenir. Dans certains cas, les requêtes ajax peut être une partie de la fonction de la logique interne, qui peut être assez compliqué (par exemple, l'appel à d'autres fonctions), et dans ce cas, vous pourriez ne pas attendre jusqu'à ce que ladite fonction est effectuée avec l'ensemble de sa logique, plutôt que de seulement d'attente pour le
ajax
partie à compléter.$.ajaxStop
ici peut également être lié à toutHTML
nœud que vous pensez peut-être modifié parajax
.De nouveau le but de ce gestionnaire est de savoir quand il n'y a pas de active
ajax
de ne pas effacer ou réinitialiser quelque chose.P. S. Si vous n'avez pas l'esprit à l'aide de ES6 syntaxe, alors vous pouvez utiliser
Promise.all
connuajax
méthodes. Exemple:Un point intéressant ici est qu'il fonctionne à la fois avec
Promises
et$.ajax
demandes. Voici jsFiddle démontrant la dernière..ajaxError()
, parce que sinon, je crois que votre code ne sera pas exécutée si vos appels ajax échouer.$(document).ajaxStop(function () { callYourFunction(); }); $(document).ajaxError(function () { callYourFunction(); });
voir api.jquery.com/category/ajax/global-ajax-event-handlersJ'ai trouvé un bonne réponse par gnarf mon auto qui est exactement ce que je cherchais 🙂
jQuery ajaxQueue
Ensuite, vous pouvez ajouter une requête ajax à la file d'attente comme ceci:
Utiliser le
ajaxStop
événement.Par exemple, disons que vous avez un de chargement ... message lors de l'extraction de 100 requêtes ajax et que vous voulez cacher ce message une fois chargé.
De l'jQuery doc:
Notez aussi qu'il va attendre que toutes les requêtes ajax être effectué sur cette page.
REMARQUE: Les réponses ci-dessus, l'utilisation des fonctionnalités qui n'existaient pas à l'époque que cette réponse a été écrite. Je recommande d'utiliser
jQuery.when()
à la place de ces approches, mais je pars de la réponse des fins historiques.-
Vous pourriez probablement vous en tirer avec un simple comptage de sémaphore, bien que comment la mettre en œuvre, serait dépend de votre code. Un exemple simple serait quelque chose comme...
Si vous voulais que cela fonctionne comme {async: false}, mais vous ne voulez verrouiller le navigateur, vous pourriez faire la même chose avec un jQuery file d'attente.
.get()
. De cette façon, au moins vous n'avez pas de duplication de code. Non seulement cela, mais la déclaration d'unefunction(){}
chaque fois alloue de la mémoire à chaque fois! Plutôt une mauvaise pratique, si on peut appeler un statiquement fonction définie.var semaphore
? N'est-ce pas assez d'avoir seulementall_queued
?$.when()
), mais je préfère utiliser uniquement lesemaphore
variable (prise deall_queued
unnecesssary) par l'initialisation de lasemaphore
avec le nombre de requêtes AJAX (dans votre exemple 4).$.when()
quand cela a été écrit.javascript est basé sur des événements, de sorte que vous ne devriez jamais attendre, plutôt crochets fixés/rappels
Vous pouvez probablement utiliser simplement le succès/complète les méthodes de jquery.ajax
Ou vous pouvez utiliser .ajaxComplete :
si youy devrait afficher une pseudo-code de la façon dont votre(s) requête ajax(s) est(sont) appelés à être plus précis...
Un peu de solution de contournement est quelque chose comme ceci:
L'espère, peut être utile...
Comme d'autres réponses mentionné que vous pouvez utiliser
ajaxStop()
attendre jusqu'à ce que toutes les requêtes ajax sont terminés.Si vous voulez le faire pour un spécifique
ajax()
demande le meilleur que vous pouvez faire est d'utilisercomplete()
méthode à l'intérieur de la certaine requête ajax:Mais, Si vous avez besoin d'attendre pour peu de et certains requête ajax à faire? Utiliser le merveilleux javascript promesses attendre jusqu'à ce que la ces ajax vous voulez attendre de faire. J'ai fait un peu de temps, facile et lisible exemple pour vous montrer comment ne promet fonctionne avec ajax.
Veuillez jeter un oeil à l'exemple suivant, sa en vaut la peine. J'ai utilisé
setTimeout
afin de clarifier l'exemple.JS:
CSS:
HTML:
$.ajax
retourne déjà une Promesse.jQuery vous permet de spécifier si vous souhaitez que la requête ajax asynchrone ou pas. Vous pouvez tout simplement faire des requêtes ajax synchrone et puis le reste du code ne sera pas exécuté jusqu'à leur retour.
Par exemple:
async
avec la valeurfalse
est allé obsolète (par des normes, et non pas par jQuery) dans la plupart des navigateur des cas d'utilisation. Il peut lancer des exceptions dans une version plus récente des navigateurs. Voir xhr.spec.whatwg.org/#sync-warning (s'applique àasync
paramètre de xhropen
méthode, qui est ce qui utilise jQuery).Si vous avez besoin de quelque chose de simple; une fois et fait de rappel
Vous pouvez également utiliser async.js.
Je pense que c'est mieux que de $.lorsque vous pouvez fusionner tous les types d'appel asynchrone qui ne prend pas en charge les promesses de la boîte, comme les délais d'attente, SqlLite appels, etc. et pas seulement les requêtes ajax.
Sur la base de @BBonifield réponse, j'ai écrit une fonction d'utilité, de sorte que le sémaphore de la logique n'est pas répandue dans tous les appels ajax.
untilAjax
est la fonction d'utilité qui appelle une fonction de rappel lorsque tous les ajaxCalls sont terminés.ajaxObjs
est un tableau de l'ajax réglage objets[http://api.jquery.com/jQuery.ajax/]
.fn
est fonction de rappelExemple:
doSomething
fonction utiliseuntilAjax
.Je recommande fortement d'utiliser $.lorsque() si vous êtes à partir de zéro.
Même si cette question a plus de millions de réponses, je n'ai toujours pas trouver quelque chose d'utile pour mon cas. Disons que vous avez à traiter avec une base de code existante, déjà de faire quelques appels ajax et ne veulent pas d'introduire de la complexité de promesses et/ou de refaire l'ensemble de la chose.
On peut facilement profiter de jQuery
.data
,.on
et.trigger
les fonctions qui ont été une partie de jQuery depuis toujours.Codepen
Les bonnes choses au sujet de ma solution est la suivante:
il est évident que le rappel dépend exactement
la fonction
triggerNowOrOnLoaded
ne se soucie pas si les données ont déjà été chargée, ou que nous sommes toujours en attente pour ellec'est super facile de le brancher sur un code existant
JS:
HTML:
$.when
ne fonctionne pas pour moi,callback(x)
au lieu dereturn x
a travaillé comme décrit ici: https://stackoverflow.com/a/13455253/10357604Je suis en utilisant la taille de vérifier lors de tous ajax chargement terminé
JS:
HTML:
De développer Alex réponse, j'ai un exemple avec une variable d'arguments et de promesses. J'ai voulu charger des images via ajax et de les afficher sur la page après ils sont tous chargés.
Pour ce faire, j'ai utilisé les éléments suivants:
Mis à jour à travailler pour un seul ou de plusieurs url: https://jsfiddle.net/euypj5w9/
J'ai rencontré ce problème et a créé un plugin générique jquery_counter de le résoudre:
https://bitbucket.org/stxnext/jquery_counter/
J'ai trouvé de façon simple, à l'aide de
shift()
Ma solution est la suivante
Travaillé très bien. J'en ai essayé beaucoup de façons différentes de le faire, mais j'ai trouvé ceci pour être le plus simple et le plus réutilisable. Espérons que cela aide
Regarde ma solution:
1.Insérer cette fonction (et variable) dans votre fichier javascript:
2.Buil un tableau avec vos demandes, comme ceci:
3.Créer fonction de rappel:
4.Appelez le runFunctionQueue fonction avec des paramètres:
Solution donnée par Alex fonctionne très bien. Même concept mais en l'utilisant, une manière un peu différente (lorsque le nombre d'appels n'est pas connu à l'avance)
http://garbageoverflow.blogspot.com/2014/02/wait-for-n-or-multiple-or-unknown.html
Essayer de cette façon. faire une boucle à l'intérieur de java script la fonction d'attendre jusqu'à ce que l'appel ajax fini.
setTimeout()
ne PAStake a sleep
. Dans ce cas, vous venez de bloquer tous les onglets jusqu'àdone
devient vrai.done
ne sera jamais vraie, tandis 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, par conséquent, ne sera jamais exécuté, le rappel à l'ajax succès.