Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nested jQuery $.when

Essentially I am tring to write this:

var async1 = $.when( a1() ).then(function(){ a2() });
var async2 = $.when( a3() ).then(function(){ a4() });

$.when(async1, async2).then(function(){ 
    console.log("complete");
}); 

But at the moment when a1 and a3 have executed the function considers itself resolved.

I put together the same example in a fiddle: http://jsfiddle.net/Z7fzR/

like image 388
Jon Wells Avatar asked Dec 12 '12 15:12

Jon Wells


2 Answers

You never actually return the promise objects created by a2() and a4() from the callback; this effectively returns null, which apparently counts as a completion for $.when purposes:

http://jsfiddle.net/Z7fzR/1/

like image 111
Explosion Pills Avatar answered Oct 01 '22 23:10

Explosion Pills


You are throwing away the promise objects that a2 and a4 return, essentially passing undefined back to the original when, which causes it to resolve immediately:

If a single argument is passed to jQuery.when and it is not a Deferred, it will be treated as a resolved Deferred and any doneCallbacks attached will be executed immediately.

Add some returns and it works fine.

var async1 = $.when(a1()).then(function(){ return a2(); });
var async2 = $.when(a3()).then(function(){ return a4(); });

$.when(async1, async2).then(function(){
    console.log("complete");
});  

http://jsfiddle.net/Z7fzR/2/

like image 41
jbabey Avatar answered Oct 01 '22 22:10

jbabey