plusieurs appels ajax attendre pour la dernière fois à la charge, puis de l'exécuter

J'ai plusieurs requêtes ajax en cours d'exécution au même moment, et j'ai envie d'attendre le dernier à revenir, et puis exécutez le gestionnaire de succès sur tous les appels ajax. Pour simplifier l'exemple, pensez à:

$.ajax({//ajax call 1
    url:page1.php,
    success: function(data1){
        //do something with data1
    }
});

....

$.ajax({//ajax call 2
    url:page2.php,
    success: function(data2){
        //do something with data2
    }
});
//consider more than just two concurrent requests

Disons que toutes les demandes sont envoyées en même temps. Comme ils sont asynchrones, ils seront de retour à des moments différents. Disons qu'une demande de 100ms pour le retour et l'autre demande prend 3000 ms pour le retour. Je ne sais pas où l'on sera de retour en premier ou en dernier. Ils sont tous à jour le DOM d'une certaine manière, et je veux ces changements montré au spectateur à la fois sur une mise à jour. Comment puis-je faire cela?

Du mieux que je peux penser à est de sauver data1 et data2 comme des variables globales. Et puis avoir une variable compteur qui compte à chaque fois un succès est retourné. Ensuite, sur compteur==TOTAL_NUM_REQUESTS appeler une fonction comme updateAll(), puis traverse toutes les variables globales et les met où ils doivent aller. Mais ce qui semble désordonné et sujette aux erreurs. En Plus ça fait beaucoup de variables globales.

Ce que j'idéalement veux, c'est le succès des gestionnaires de sommeil à son retour, puis sur ma condition de compter tous retournés, envoyer réveil des messages à tous et qu'ils peuvent reprendre l'exécution. Ce qui semble le plus propre, mais je ne suis pas au courant de toutes les fonctionnalités de ce genre dans javascriptland.

N'quelqu'un a des slick idées pour cela?

RÉPONSE DE MISE À JOUR

Grâce à Lee ci-dessous, j'ai été en mesure de parvenir à une solution. Ma solution ressemblé à son ci-dessous. J'ai créer une liste de async variables qui ont été affectées à l' $.appel ajax. D'abord le gestionnaire de succès de ces appels ajax étaient encore appelé, j'ai donc enlevé et les mettre dans une autre fonction qui sera par la suite appelé par ce when bloc que j'ai écrit. J'ai passé results à la fonction comme ceci:

var results = [];
results.push(async1);
results.push(async2);
... for all the results ...

$.when.apply(this, results).done(function() {
   for(var i=0;i<arguments.length;i++){
     dataobject=arguments[i][0]
     if(dataobject.variousattribute)
       mySuccessHandlerFirstGuy(dataobject)
     else if(dataobject.anotherattribute)
       mySuccessHandlerSecondGuy(dataobject)
       //etc ....
   }
};

L'objet arguments a pris un peu de travail pour comprendre ce que c'était. C'était un tableau 2d (liste de listes). Le premier indice représenté le retour de l'objet correspondant à une requête ajax. Il semble à être dans l'ordre, mais il serait préférable d'avoir votre serveur de retourner quelque chose que vous pouvez chercher et écrire un if/else bloc en conséquence. Ensuite, dans cet élément, il semble y avoir 3 éléments dans cette liste. La première étant la valeur qui a été renvoyée par le serveur, c'est à dire ce que vous voulez. Le second était toujours une chaîne success, vous pouvez sans doute utiliser pour vérifier si l'appel a travaillé. Et le troisième élément de cette liste semble être la demande initiale (même si je ne suis pas sûr). Ce n'est d'aucune utilité pour moi.

De toute façon, j'espère que cela aide quelqu'un dans le futur. Et encore merci à Lee pour me pointer dans la bonne direction.

OriginalL'auteur Landon | 2013-01-22