J'ai passé beaucoup trop d'heures à chercher des questions similaires et à essayer des solutions, alors j'espère que quelqu'un a une solution.
En fait, je voudrais être informé de la fin d'une fonction a(). Le problème est que la fonction contient un appel ajax et une boucle qui appelle b(), qui contient à nouveau un appel ajax.
MIS À JOUR AVEC LE VIOLON : http://jsfiddle.net/hsyj7/1/
Comme cela :
// called by main()
function a() {
return $.ajax("http://url1").pipe(function(data){
for (var i = 0; i < 2; i++) {
console.log('a called');
b();
}
});
}
// called by a()
function b() {
for (var i = 0; i < 2; i++) {
$.ajax("http://url2", function(data){
// do something
console.log('b called');
}
}
}
function main(){
$.when(a()).done(function(){
console.log('all completed');
});
}
Ce que j'aimerais voir alors, c'est que les deux appels à a() soient placés en haut de la page :
a called
b called
b called
a called
b called
b called
all completed
Au lieu de cela, j'obtiens
a called
all completed
b called
b called
Ou une de ses variantes.
Je suis conscient que le code ci-dessus manque de la fonctionnalité defer à la fois dans la boucle et dans b(). Dans certaines des variantes que j'ai essayées, le gestionnaire done() dans main() n'est jamais appelé.
Quelqu'un sait-il comment procéder ?