You have a race condition here as well as introducing a 30 second delay. Also, you have global state.
Both of these are really unreliable and bad.
Assuming you don't want to introduce a good promises library (I'd recommend bluebird) using the tools you already have it can be done with:
Using jQuery:
var request1 = $.ajax(...);
var request2 = $.ajax(...);
var request3 = $.ajax(...);
$.when(request1,request2,request3).done(function(results){
// results contains all 3 request data
// no delay, will resolve when all 3 are done
// requests are made simultaneously
render(results);
});
Using standard Promise (Bluebird compatible):
var request1 = $.ajax(...);
var request2 = $.ajax(...);
var request3 = $.ajax(...);
Promise.all(request1,request2,request3).then(function(results){
// results contains all 3 request data
// no delay, will resolve when all 3 are done
// requests are made simultaneously
render(results);
});
The lambda can always be away with, you can do:
Promise.map(["url1","url2","url3"],$.get).all(render);