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
Vous devez vous connecter pour publier un commentaire.
Utiliser le jQuery $.lorsque la fonction de() pour exécuter quelque chose quand tous les appels ajax finition:
jQuery.lorsque docs
Ajouté en réponse aux questions:
Si vous avez un tas d'appels ajax, vous pouvez utiliser l'option "appliquer" comme ceci:
"quand" juste construit un nouveau reporté sur le dessus de l'ensemble de ses paramètres de manière tout à la normale différés méthodes de travail. La seule partie délicate, c'est qu'il échoue lors de la première échoue et les autres peuvent ne pas être complète. 'done' est exécuté seulement si tous les réussir. (C'est comme "échouer" est un " ou " et "terminé" pour réussir, c'est un "et".)
ça a l'air prometteur,
var async1
doit être de portée mondiale, à droite?grande, que si le
async2
appel est dans une boucle qui s'exécute une quantité dynamique de fois? Dans ce cas, je n'aurais que deux instances (variables) dans mon code avec des fonctions ajax, mais je veux que ça à faire, par exemple, 5 appels ajax avant de s'exécuter. Quelle est la syntaxe pour$.when
dans ce cas?J'ai développé la solution à ma question de départ ci-dessus pour les futurs lecteurs. Merci Lee pour votre aide.
OriginalL'auteur Lee Meador
Ce qui peut probablement être fait de façon similaire à ce que vous avez déjà proposé.
Tout d'abord, créer des variables globales
var sleep = true
etvar request_count = 0
. Puis démarrer une minuterie qui vérifierequest_count
contre le nombre total de demandes chaque seconde. Ensuite, votre succès fonctions peuvent être incrémentéesrequest_counter
puis démarrer en boucle jusqu'à cesleep == false
. Puis, lorsque la fonction de surveillance à l'aide de la minuterie détecterequest_count == TOTAL_REQUESTS
il définitsleep = false
, et de tous vos succès les fonctions de continuer leurs activités à ce point.while(request_count<TOTAL_COUNT) busywork=1;
je ne pense pas que faire une longue boucle est une bonne idée. Suis-je tort?Oui, c'est essentiellement ce que je suggère. Mais vous avez raison, si vous pouvez l'éviter, ce serait mieux, et il ressemble à Lee suggestion est la bonne façon de faire.
OriginalL'auteur Scott S
Une solution simple est d'utiliser PreloaderQ module
https://www.npmjs.com/package/preloaderq
Utiliser comme ci-dessous
La emptycallback sera appelée après que les deux sont finis
OriginalL'auteur Jayadeep KM