UPDATE Et deux ans plus tard, cela semble insensé car la réponse acceptée a changé pour quelque chose de bien meilleur ! (Bien qu'elle ne soit toujours pas aussi bonne que la réponse de Yair Leviel qui utilise la fonction jQuery when
)
18 mois plus tard, je viens de rencontrer quelque chose de similaire. J'ai un bouton de rafraîchissement, et je veux que l'ancien contenu soit fadeOut
et ensuite le nouveau contenu vers fadeIn
. Mais je dois aussi get
le nouveau contenu. Le site fadeOut
et le get
sont asynchrones, mais ce serait une perte de temps de les exécuter en série.
Ce que je fais est en fait la même chose que la réponse acceptée, mais sous la forme d'une fonction réutilisable. Son principal avantage est qu'elle est beaucoup plus courte que les autres suggestions présentées ici.
var parallel = function(actions, finished) {
finishedCount = 0;
var results = [];
$.each(actions, function(i, action) {
action(function(result) {
results[i] = result;
finishedCount++;
if (finishedCount == actions.length) {
finished(results);
}
});
});
};
Vous lui passez un tableau de fonctions à exécuter en parallèle. Chaque fonction doit accepter une autre fonction à laquelle elle transmet son résultat (le cas échéant). parallel
assurera cette fonction.
Vous lui passez également une fonction qui sera appelée lorsque toutes les opérations seront terminées. Cette fonction recevra un tableau contenant tous les résultats. Donc mon exemple était :
refreshButton.click(function() {
parallel([
function(f) {
contentDiv.fadeOut(f);
},
function(f) {
portlet.content(f);
},
],
function(results) {
contentDiv.children().remove();
contentDiv.append(results[1]);
contentDiv.fadeIn();
});
});
Ainsi, lorsque l'on clique sur mon bouton de rafraîchissement, je lance la fonction jQuery fadeOut
l'effet et aussi mon propre portlet.content
(qui effectue une opération asynchrone get
construit un nouveau contenu et le transmet), puis, lorsque les deux sont terminés, je supprime l'ancien contenu, j'ajoute le résultat de la deuxième fonction (qui se trouve dans le fichier results[1]
) et fadeIn
le nouveau contenu.
Comme fadeOut
ne passe rien à sa fonction d'achèvement, results[0]
contient vraisemblablement undefined
alors je l'ignore. Mais si vous aviez trois opérations avec des résultats utiles, elles se placeraient chacune dans la section results
dans le même ordre que celui dans lequel vous avez passé les fonctions.