Ajaxez la chaîne et exécutez-la en séquence. Jquery différé
J'ai 3 processus qui a besoin d'ajax pour terminer. Mais il est asynchrone et il ne parvient pas à faire ce que je voulais faire..
Permet de dire:
function a(param1, param2) {
$.post(..., function(result){
if(result){
b();
} else {
console.log("failed a");
}
})
}
function b() {
$.post(..., function(result){
if(result){
c();
} else {
console.log("failed b");
}
})
}
function c() {
$.post(..., function(result){
if(result){
console.log("successful");
} else {
console.log("failed b");
}
})
}
Je veux exécuter comme ce
a
b
c
Que le code fonctionne parfaitement, comme vous pouvez le voir..
mais si l'utilisation d'une boucle.
var data = [{param1 : 1235, param2: 3214}, {param1 : 5432, param2: 9876}];
$.each(data, function(k,v){
a(v.param1, v.param2)
});
Il ne fonctionnera pas comme prévu et va tout simplement faire:
a
a
b
b
c
c
au lieu de
a
b
c
a
b
c
source d'informationauteur Joey Hipolito
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs façons d'écrire ce genre de chose.
Une approche flexible est séparé "actions" à partir de "séquence", permettant de :
Voici un moyen de code de cette approche, à l'aide de
.then()
exclusivement pour l'enchaînement logique :Alternativement, si vous voulez avoir une seule fonction d'asynchrone,
a
appelé à partir de l'intérieur d'une boucle, puis le code pourrait être quelque chose comme ceci :Vous pouvez enchaîner les appels asynchrones comme les appels ajax à l'aide de jQuery différée de l'objet et à l'aide de "et ensuite".
Vous pouvez également modifier pour utiliser les fonctions qui retourne un différé promesse objet, au lieu d'un appel ajax que j'ai dans mon exemple.
http://jsfiddle.net/q4cFv/
(Exemple avec la fonction async: http://jsfiddle.net/q4cFv/1/)
Je vois que c ne dépendent pas de b résultat, et b ne dépendent pas de un résultat.
À la suite de la SAISIR principes (http://en.wikipedia.org/wiki/GRASP_(objet oriented_design)un ne sais pas b et b ne sais pas c.
Lorsque l'on programme, de se rappeler la portée des principes ou lignes directrices est très important.
Une forte Cohésion et de Couplage Faible signifie que notre code sera mieux, plus réutilisable et facile à entretenir.
La fonction principale qui sait unbet c doit construire l'enchaînement des appels.
Les fonctions seraient les suivantes:
La fonction principale serait:
$.iterativeWhen n'existe pas en jQuery, j'ai donc construit. Il fonctionne avec jQuery 1.8 et versions ultérieures.
La mockPost une fonction qui simule un appel à $.post avec une probabilité de succès:
La sortie du journal est:
jsFiddle ici: http://jsfiddle.net/E2tp3/
Votre problème est que vous êtes en appelle à tous les
a
s à la fois, mais vous voulez attendre pour le premier cycle avant de passer à la suivante. Vous souhaitez attendre que le précédent 'un' cycle se termine avant de commencer le cycle suivant.Supposons a,b,c accepter un rappel, et de la transmettre,
une ressemblerait
b irait comme:
Et c ressemblerait à:
Cela nous permet de savoir quand un cycle est complet. Ce qui nous permet d'écrire:
Ici est merveilleusement simple et très effet AJAX chaînage /file d'attente de plugin. Il exécutera vous ajax méthodes dans l'ordre les uns après les autres.
Il fonctionne en acceptant un éventail de méthodes et de les mettre dans l'ordre. Il l'habitude d'exécuter la méthode suivante en attendant une réponse.