12
votes

Comment contrôler l'ordre des fonctions appelé en jQuery $ (document) .Ready

Je dois être capable de contrôler l'ordre des articles en cours de traitement dans le $ (document) .Ready .
Ce sont des contrôles multiples, chargés de plusieurs fichiers, qui demandent tous à être appelés dans l'événement prêt . Ils démarrent tous un appel ASYNC au serveur (AJAX). Ce n'est qu'après qu'ils sont tous faits, je dois faire un travail supplémentaire.

Quelle serait la solution élégante pour cela?


6 commentaires

Trouvé ReadyX à plugins.jquery.com/project/readyex Il affirme qu'il contrôle la commande. Mais cela ne fonctionnera pas avec 1.4.x depuis que lishyliste n'est plus disponible.


Objectivement, quel est votre problème avec ma solution?


Rien de mal avec ça. Votez-le. Espérait qu'un soutien interne de JQuery. Quelque chose comme le réadyliste. Votre solution fonctionne, mais nécessite de toucher toutes les fonctions concernées.


Je ne sais pas comment ReadyX aurait résolu ce problème. Vous êtes intéressé par l'ordre des rappels aux appels Ajax, non sur l'ordre des rappels Dom Ready, correct? Si tel est le cas, l'ordre des fonctions DOM Ready n'aura aucune incidence sur le calendrier des rappels Ajax.


Par exemple, à l'aide de la "dernière" file d'attente dans ReadyX Je peux commencer à surveiller pour $. Ajaxstop ', sachant que je suis assuré que toutes les demandes Ajax ont déjà commencé (et éventuellement terminées), si je les initiées dans la file d'attente principale ReadyX`


Mais le problème est que si le $. Ajaxstop Evénement est tiré avant Domready Vous ne le verrez jamais.


4 Réponses :


1
votes

8 commentaires

Le problème que je vais avoir un nombre inconnu si $. Ajaxstop événements, puisque la page a un nombre dynamique de ces commandes.


@Ron pas nécessairement vrai. $ .Ajaxstop Seuls les incendies après Tous les appels AJAX sont terminés. Cependant, si un appel terminé avant qu'un autre ne puisse fonctionner, vous en auriez deux.


Ce serait toujours un problème. Je ne peux pas être sûr que toutes les demandes ont commencé ensemble. Ou qu'aucun terminé avant tout n'a été démarré.


Pour être totalement honnête, à ce stade, vous avez atteint un point d'extrémité logique. Il n'ya probablement aucun moyen que vous puissiez savoir, sur la base d'aucune donnée préalable, que toutes vos demandes dynamiques ont commencé et complétées. En effet, l'état de toutes les demandes qui ont déjà été achevées en cours (même bien que davantage arrivent) est identique à l'État où toutes les demandes incendient et complètes. C'est essentiellement le problème de halte: en.wikipedia.org/wiki/halting_problem


Oui. Mais je sais que toutes les demandes ont regardé par l'heure prêt est terminé


Ok, alors cela ne se déplace pas autour du problème $ .Ajaxstop, mais ma solution, tant qu'elle est exécutée à l'intérieur du bloc doit éviter ce problème.


Si vous définissez le gestionnaire $ .AJAXSTOP avant $ (document) .Ready () (que vous pouvez), puis lancez tous les appels $ .AJAX () à $ (document) .Readady (), le premier complétant rapidement devrait ne pas être un problème. Même tester localement, je ne pense pas que vous rencontriez jamais dans cette situation, car ils vont tous commencer à peu près au même moment après que la page rend les rendues de la page. N'oubliez pas que même si vous enregistrez $ (document) .Readady () des gestionnaires de la page, ils finiront tous d'exécuter à peu près au même moment.


Vous êtes absolument correct, ce serait un bon mouvement pour exécuter le gestionnaire $ .AJAXSTOP avant l'événement Domready , et vous pourriez probablement supposer en toute sécurité que vous ne rencontreriez pas dans le multiple ajaxstop < / CODE> ESSION EDGE, ÉVÉNEMENT Bien qu'il s'agisse d'une possibilité discrète. Vaut probablement la peine de donner un coup.



0
votes

Créer une variable qui détient une valeur de 0. Sur la fonction de réussite de chaque incrément d'appel AJAX à une valeur de 1 et vérifiez si cette valeur est égale à votre nombre total d'appels s'il exécute votre fonction de complète.


1 commentaires

@ Shog9 votre droite. Vous pouvez simplement utiliser une variable car elle resterait dans la portée du temps.



2
votes

John Resig sur l'ordre d'évaluation de la fonction en $ (document) .Readady:

chaque fois qu'une nouvelle fonction est ajouté à la file d'attente, il est juste d'être ajouté à un tableau - puis être retombé à nouveau lorsqu'il est exécuté. Laissez-moi savoir si cela ne le fait pas arriver pour vous.

$. Lisayliste - uniquement dans les versions PRE 1.4

jQuery a exposé une propriété appelée $. Readylist , qui est un tableau pour permettre à la manipulation de la fonction de fonction, cependant $. RAISYLIST DANS PLUS SUPPOSÉ SUPPOSÉ SUR JQUERY 1.4.0

Hackerish Way

Vous pouvez essayer $ (fenêtre) .charger (fonction () {}); , il doit exécuter une fois que toute la fenêtre a été chargée (pas lorsque le document est prêt, car il est prêt avec $ (document) .Readady ()


1 commentaires

Oui. Mais les fonctions sont ajoutées à la file d'attente de différents contrôles de la page. Je veux m'assurer que quelque chose est fait en dernier. Comme un "enfin" dans un essais attraper.



7
votes

Demandes asynchrones feu dans l'ordre, mais reviendra dans l'objet qu'ils complètent en premier. Il n'y a donc pas de chemin sûr de les forcer à finaliser en même temps, vous pouvez créer des règles pour uniquement exécuter le code après que certains groupes se sont retournés.

Par exemple, définissez une fonction de rappel avec un ensemble de règles, et transmettez-le à chaque Callback de toutes vos demandes AJAX. xxx

puis définissez les indicateurs à l'intérieur de vos fonctions de réussite: xxx


2 commentaires

C'est intéressant. Mais j'ai un dynamique nombre de contrôles qui démarreraient ces demandes asynchronisées. Je ne peux pas avoir un statique si .


Depuis février 2011, JQuery 1.5 a cette nouvelle nouvelle chose différée et promesse. Cela correspond à cet objectif.