jquery, comment faire pour exécuter une fonction dès qu'une autre fonction se termine
*Remarque: la Ré-écriture question:
Je suis en train d'écrire la suite de à l'extérieur de l'individu appels de fonction:
exemple:
fonction f1(){ faire quelque chose 1 } la fonction f2(){ faire quelque chose 2 } la fonction d'exécution 1 quand fait fonction run 2
(Voir les commentaires ci-dessous pour jsfiddles)
Problème est, les boîtes de charger en même temps. Le comportement DEVRAIT être, charge de rouge, quand il est fait, le chargement vert.
Si ce n'est pas une méthode commune dans jQuery, laissez-moi savoir, peut-être que je suis juste à chasser un fantôme...
C'est ce que je veux: jsfiddle.net/kolbaba/Wjmfw/1 Ces deux tentatives sont faites pour cela: jsfiddle.net/kolbaba/7LvGS/3, jsfiddle.net/kolbaba/SCKTV/8
En fonction de ce que "faire quelque chose" est en train de faire, les réponses vont changer. Si votre "faire quelque chose" quelque chose qui est asynchrone, alors vous aurez besoin de faire quelques astuces fournis ci-dessous. Toutefois, s'ils sont tous les appels synchrones, puis elles s'exécutent de façon synchrone. Dans otherwords, si il n'est pas asynchrone, ils seront exécutés dans l'ordre si vous appelez l'un après l'autre.
c'est un asynch tentative. J'ai 10 niveaux dans un jeu, chaque niveau est une fonction. Je veux tirer du fn 1-10 sur un maigre fonction clean, sans toutes les fonctions imbriquées et des effets et des animations... Voir ici pour une visualisation de ce que je veux dire: jsfiddle.net/kolbaba/c4LQv/1
laissez-moi savoir si vous avez besoin de plus d'aide. Si la fonction 1 n'a rien asynchrone, puis votre code ne fonctionnera pas comme prévu. Si l'une des fonctions les appels asynchrones, alors vous n'avez aucune garantie dans quel ordre ils vont finir. À l'aide de deferreds comme je l'ai montré ci-dessous, vous permettra d'avoir un contrat sur quel ordre les fonctions de s'exécuter dans. Si vos fonctions seulement d'effectuer la synchronisation des tâches, puis vous n'aurez pas besoin deferreds.
En fonction de ce que "faire quelque chose" est en train de faire, les réponses vont changer. Si votre "faire quelque chose" quelque chose qui est asynchrone, alors vous aurez besoin de faire quelques astuces fournis ci-dessous. Toutefois, s'ils sont tous les appels synchrones, puis elles s'exécutent de façon synchrone. Dans otherwords, si il n'est pas asynchrone, ils seront exécutés dans l'ordre si vous appelez l'un après l'autre.
c'est un asynch tentative. J'ai 10 niveaux dans un jeu, chaque niveau est une fonction. Je veux tirer du fn 1-10 sur un maigre fonction clean, sans toutes les fonctions imbriquées et des effets et des animations... Voir ici pour une visualisation de ce que je veux dire: jsfiddle.net/kolbaba/c4LQv/1
laissez-moi savoir si vous avez besoin de plus d'aide. Si la fonction 1 n'a rien asynchrone, puis votre code ne fonctionnera pas comme prévu. Si l'une des fonctions les appels asynchrones, alors vous n'avez aucune garantie dans quel ordre ils vont finir. À l'aide de deferreds comme je l'ai montré ci-dessous, vous permettra d'avoir un contrat sur quel ordre les fonctions de s'exécuter dans. Si vos fonctions seulement d'effectuer la synchronisation des tâches, puis vous n'aurez pas besoin deferreds.
OriginalL'auteur nthChild | 2013-01-19
Vous devez vous connecter pour publier un commentaire.
Il vous suffit d'appeler la deuxième fonction à la fin de la première.
violon
Alternativement, si vous ne souhaitez pas appeler la deuxième fonction chaque fois que vous appelez la première, vous pouvez tout simplement les appeler de manière séquentielle
Cela fonctionne car il faudra patienter jusqu'à
firstFunction
est fait avant de passer àsecondFunction
violon
tant que vous n'avez pas de quoi asynchrone, en plaçant un appel à la fonction suivante à la fin de l'actuel fera l'affaire.
vous avez mentionné
point and click
qui impliquerait la nécessité pourclick
des gestionnaires d'événements. Vous devez démontrer votre code et de la majoration pour tout les détails, mais si chaquelevel
a une série de choses à cliquer sur la dernière que l'on pouvait avoir un.click(function(){nextlevel();});
à l'avance au prochain niveau. Si c'est quelque chose de basé sur le clic, alors vous aurez probablement envie d'être contenues dans des gestionnaires de clic et rien directement séquentielle.OriginalL'auteur BeardFist
Dépend des fonctions.
Réponse courte:
Pour synchrone fonctions: il suffit d'appeler l'un après l'autre.
Pour asynchrone fonctions: Dépend de ce qu'il fait en asynchrone.
animations jQuery? Définir un rappel paramètre de l'animation de la méthode ou de la fx file d'attente de la Promesse de l'objet.
setTimeout/setInterval/quelque chose d'autre? Le plus probable, les fonctions devra être réécrite de façon à fournir un rappel ou Différés/la Promesse de l'objet.
Voir cette ou cette pour des exemples.
Réponse longue:
Selon la jsFiddles dans vos commentaires, vous avez ces deux fonctions:
Vous voulez
secondFunction
à courir aprèsfirstFunction
, et vous préférez ne pas toucher à ces fonctions. Si c'est le cas, il n'y a qu'une seule solution je pense: Obtenir un La promesse de l'objet de l'élément quifirstFunction
est d'animer, et de définir dessecondFunction
comme un gestionnaire de succès:jsFiddle
promise()
retourne une Promesse objet lié à l'animation en cours de l'état de cet élément.$('.one').promise().then(secondFunction)
est essentiellement en disant: "je promets d'exécutersecondFunction
lors de l'animation en cours pour.one
est fait.Si vous êtes prêt à altérer les fonctions existantes, vous pouvez aussi appeler
secondFunction
comme un rappel paramètre de lafadeOut
dansfirstFunction
, mais ce n'est pas très élégant.Si vous êtes prêt à réécrire vos fonctions, la solution idéale est de les apprivoiser votre async fonctions à l'aide de Deferreds et de Promesses. Voici un petit aperçu:
À l'aide de ces outils, vous pouvez réécrire vos fonctions de préciser quand ils sont "fait", et vous pouvez donner le code en dehors de vos fonctions à la capacité de savoir quand (et exécuter après) qu'ils ont fait.
Réécrit pour utiliser Différés et la Promesse, le code ressemble à ceci:
jsFiddle
Si toutes les fonctions sont écrites de cette façon, vous pouvez le contrôle de l'exécution de l'ordre et de les exécuter de manière séquentielle à l'aide de
()
. Voici un plus approfondie exemple:jsFiddle
OriginalL'auteur JR.
Deferreds sont une option. Vous pourriez toujours faire ce qui suit:
Le seul truc, c'est qu'à l'intérieur de firstFunction, vous devez effectuer les opérations suivantes:
La lorsque la fonction va attendre jusqu'à ce que le différé renvoyé par la firstFunction appel est résolu. Une fois que le différé est résolu (en l'ajax succès de rappel)".puis " la déclaration de l'incendie, appeler votre secondFunction.
Le jQuery docs expliquer le report de l'API très bien.
OriginalL'auteur frosty
vous pouvez utiliser le jquery Rappels de fonction, à partir de v1.7up
Malheureusement cela ne fonctionne pas si les fonctions sont asynchrones. jsfiddle.net/7LvGS/4
OriginalL'auteur Koenyn
au lieu de
écrire
J'ai mis le code suivant dans la section javascript:
$(document).ready(function() { var i = 'a'; function firstFunction(){ i = i+ '_first_func'; $(".one").fadeIn(1000).delay(2000).fadeOut(); } function secondFunction(){ i = i+ '_second_func'; $(".two").fadeIn(1000).delay(2000).fadeOut(); } firstFunction(); secondFunction(); alert(i); });
Le résultat a été a_first_func_second_funcOriginalL'auteur GeorgeVremescu
J'ai eu ce problème récemment. Si vous avez un tas de fonctions qui ne async tout ça, juste les faire tous rentrer à la Différée qui vous résoudre manuellement lorsque la fonction asynchrone travail est terminé. Ensuite, vous pouvez mettre les fonctions dans un tableau et de les exécuter de manière séquentielle:
OriginalL'auteur meehocz