var d = new $.Deferred(); var pendingCall=0; function logPendingCall(){ console.log("wait in queue..no." + pendingCall); if (pendingCall > 0) { setTimeout(logPendingCall, pendingCall * 1000); return d.promise(); } else { d.resolve(); return d.promise(); } } function show(num){ alert(num); } var wrapper={ test:function(num){ logPendingCall().then(function() { show(num); }); } }; $("#test").click(function(){ pendingCall-=1; }); pendingCall+=1; wrapper.test(1); pendingCall+=1; wrapper.test(2); pendingCall+=1; wrapper.test(2);
<input type='button' id="test" value="test"/> <span>press test three times to trigger</span>