Je rencontre un problème avec les fonctions normales (non-ajax) qui impliquent de nombreuses animations dans chacune d'elles. Actuellement, j'ai simplement un setTimeout
entre les fonctions, mais ce n'est pas parfait car tous les navigateurs / ordinateurs ne sont pas identiques.
Note supplémentaire : Ils ont chacun des animations/etc séparées qui entrent en collision.
Je ne peux pas simplement mettre une fonction dans la fonction de rappel d'une autre
// multiples animations du DOM / etc
FunctionOne();
// Ce que je faisais pour attendre avant d'exécuter la prochaine fonction remplie
// d'animations, etc
setTimeout(function () {
FunctionTwo(); // autres animations du DOM (certaines déclenchées par les précédentes)
}, 1000);
Y a-t-il un moyen en js/jQuery d'avoir :
// Pseudo-code
-exécuter FunctionOne()
-lorsque terminé :: exécuter -> FunctionTwo()
Je connais $.when()
& $.done()
, mais ceux-ci sont pour AJAX...
- MA SOLUTION MIS À JOUR
jQuery a une variable exposée (qui pour une raison quelconque n'est répertoriée nulle part dans la documentation jQuery) appelée $.timers, qui contient le tableau des animations actuellement en cours.
function animationsTest (callback) {
// Test si des animations de la page sont actuellement actives
var testAnimationInterval = setInterval(function () {
if (! $.timers.length) { // des animations de la page se sont terminées
clearInterval(testAnimationInterval);
callback();
}
}, 25);
};
Utilisation de base :
// exécuter une fonction avec des animations etc
functionWithAnimations();
animationsTest(function () { // <-- ceci s'exécutera une fois que toutes les animations ci-dessus seront terminées
// votre fonction de rappel (actions à effectuer après la fin de toutes les animations)
runNextAnimations();
});
2 votes
Si
FunctionOne
n'a pas de timeout ou autre chose, vous pouvez simplement appelerFunctionOne(); FunctionTwo();
, n'est-ce pas?0 votes
Le problème est qu'ils ont tous les deux des animations séparées, etc, dans des fichiers différents - etc. Donc ils finissent par entrer en collision...
0 votes
@arxanas - Oui, JavaScript est monofilaire, mais je soupçonne qu'il veut enchaîner deux fonctions ensemble afin que l'une se déclenche toujours avec l'autre.
3 votes
$.when
et$.done
ne sont pas nécessairement réservés à l'ajax. Si vous avez diverses tâches asynchrones dans la FonctionUn que vous voulez terminer avant de déclencher la FonctionDeux, vous pouvez créer des objetsDeferred
, les mettre dans un tableau, appelerresolve()
sur chacun lorsque l'action est terminée, puis faire$.when.apply($, tableau).then(function(){...});
1 votes
Les variables globales sont mauvaises, mais dans ce cas, il pourrait être utile d'ajouter un indicateur
isRunning
.0 votes
Cela dépend beaucoup du contenu des fonctions!
1 votes
Vous avez sauvé mon application, je vous en suis éternellement reconnaissant