jQuery Différés et la Promesse d'une exécution séquentielle synchrone et asynchrone fonctions
Si je veux avoir synchrone et asynchrone fonctions de s'exécuter dans un ordre particulier, je pourrais utiliser jQuery promesse, mais il ne semble pas fonctionner de la façon dont je m'attends à ce qu'il fonctionne.
Fonctions a,b et c doit s'exécuter dans l'ordre quand dans le deferred.resolve()
est appelé, je m'attends à de la fonction b pour être exécuté, mais toutes les fonctions sont exécutées immédiatement, peu importe si la volonté est appelée.
Voici le code:
function a(){
var deferred = $.Deferred();
setTimeout(function(){
console.log("status in a:",deferred.state());
//this should trigger calling a or not?
deferred.resolve("from a");
},200);
console.log("a");
return deferred.promise();
};
function b(){
var deferred = $.Deferred();
setTimeout(function(){
console.log("status in b:",deferred.state());
deferred.resolve("from b");
},200);
console.log("b");
return deferred.promise();
}
//synchronous function
function c(){
var deferred = $.Deferred();
console.log("c");
console.log("status in c:",deferred.state());
deferred.resolve("from c");
return deferred.promise();
}
function test(){
fn=[a,b,c],i=-1,
len = fn.length,d,
d = jQuery.Deferred(),
p=d.promise();
while(++i<len){
p=p.then(fn[i]);
}
p.then(function(){
console.log("done");
},
function(){
console.log("Failed");
});
d.resolve();
//instead of the loop doing the following has the same output
//p.then(a).then(b).then(c);
//d.resolve();
}
test();
De sortie est:
a
b
status in c: pending
c
done
status in a: pending
status in b: pending
Résultat attendu:
a
status in a: pending
b
status in b: pending
c
status in c: pending
done
Essayé quelques combinaisons des modifications suivantes:
d = jQuery.Deferred();
setTimeout(function(){d.resolve();},100);
var p=d.promise();
while(++i<len){
p.then(fn[i]);
}
Mais tous avec les mêmes résultats inattendus, b est appelée avant différé de un est résolu, c est appelée avant différé de b est résolu.
OriginalL'auteur HMR | 2013-11-21
Vous devez vous connecter pour publier un commentaire.
Pour jQuery avant la 1.8, c'est un problème, mais pour les nouvelles versions de jQuery, ce n'est plus un problème:
DÉMO
Ci-dessous la démo de jQuery 1.7.2
DÉMO
jQuery < 1.8 est très bien WRT chaînage, il vous suffit d'utiliser .pipe au lieu de .alors. 1.8 simplement changé .ensuite, pour être .la pipe.
comment l'utiliser, si
a
une fonction retourne une valeur qui utilisentb
fonction et ainsi de suite.Chaparro A. La valeur retournée de
a
fonction est passé comme argument àb
fonction.OriginalL'auteur Khanh TO
jQuery < 1.8 est très bien WRT chaînage, il vous suffit d'utiliser
.pipe
au lieu de.then
. 1.8 simplement changé.then
être.pipe
.OriginalL'auteur Esailija
Note: Lorsque vous l'utilisez sans le tableau, vous n'avez pas à démarrer avec une promesse.
$.when({}).then(a).then(b)
fera l'affaire tout aussi bien. Vous ne devez assurez-vous que vous ne mettez pas dea
à l'intérieur de lawhen
.OriginalL'auteur Bet Lamed