var assetsToLoad=2; loader.on(‘load’, function(){ assetsToLoad --; if(assetsToLoad===0) show(); }); loader.load(anim); loader.load(music); We can count
function onVideoLoaded(){ checkIfAllLoaded(); } function checkIfAllLoaded(){ if(videoLoaded && musicLoaded && … ) show(); } We can count again or" use conditionals
They can be aggregated
var def1 = $.Deferred(); var def2 = $.Deferred(); $.when(def1, def2).done(function(one, two){ //… do something with one and two; }); //… later def1.resolve(val); //… even later def2.resolve(val);
var animDef = $.Deferred(); var musicDef = $.Deferred(); $.when(animDef, musicDef).done(function(){ show(); }); //when the music is loaded musicDef.resolve(); //when the animation is loaded animDef.resolve();
var animDef = $.Deferred(); var musicDef = $.Deferred(); //…later musicDef.resolve(); //…even later $.when(animDef, musicDef).done(function(){ show(); }); //No problem, still triggers, you cannot do that with event listeners!
Combine them to create bigger promises
var promise1 = $.when(animDef, musDef); var promise2 = $.when(msgDef, bgDef); $.when(promise1, promise2).done(function(){ //… do something with anim, music message and background });