Skip to content

Instantly share code, notes, and snippets.

@maxim-grishaev
Created June 16, 2011 23:20
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save maxim-grishaev/1030550 to your computer and use it in GitHub Desktop.
Save maxim-grishaev/1030550 to your computer and use it in GitHub Desktop.
Simple plugin for jQuery to flexibly manage $.Deferred objects. Adds possibility to push your Deferreds to stack after it's creation
(function($, undefined){
var when = $.when,
slice = window.Array.prototype.slice;
$.whenAll = function(){
var mainDfrd = $.Deferred(),
promise = mainDfrd.promise();
promise.resolved = 0;
promise.rejected = 0;
promise.total = 0;
promise.push = function(){
push( mainDfrd, promise, arguments );
return this;
};
push( mainDfrd, promise, arguments );
return promise;
}
function push( mainDfrd, promise, dfrdsToAdd ){
promise.total += $( slice.call(dfrdsToAdd, 0) )
.each(function( i, dfrd ){
++promise.total;
dfrd.then( function(val){
!!window.console && !!console.log && console.log(val);
if( ++promise.resolved === promise.total ) {
mainDfrd.resolve.apply( mainDfrd, arguments );
}
}, function(){
++promise.rejected;
mainDfrd.reject.apply( mainDfrd, arguments );
promise.left = promise.left;
} );
})
.length;
}
})(jQuery);
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>Test</title>
</head><body>
___<br>
Resolved count: <span id="resolved">0</span><br>
Rejected count: <span id="rejected">0</span><br>
Total count: <span id="total">0</span><br>
Last value: <span id="val">0</span><br>
Status: <span id="status">In progress</span><br>
___
<script src="http://code.jquery.com/jquery-1.6.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
(function($, undefined){
var when = $.when,
slice = window.Array.prototype.slice;
$.whenAll = function(){
var mainDfrd = $.Deferred(),
promise = mainDfrd.promise();
promise.resolved = 0;
promise.rejected = 0;
promise.total = 0;
promise.push = function(){
push( mainDfrd, promise, arguments );
return this;
};
push( mainDfrd, promise, arguments );
return promise;
}
function push( mainDfrd, promise, dfrdsToAdd ){
promise.total += $( slice.call(dfrdsToAdd, 0) )
.each(function( i, dfrd ){
++promise.total;
dfrd.then( function(val){
!!window.console && !!console.log && console.log(val);
if( ++promise.resolved === promise.total ) {
mainDfrd.resolve.apply( mainDfrd, arguments );
}
}, function(){
++promise.rejected;
mainDfrd.reject.apply( mainDfrd, arguments );
promise.left = promise.left;
} );
})
.length;
}
})(jQuery);
/**
* Tests
*/
function updateNumbers(val, status){
$('#resolved').html(d0.resolved);
$('#rejected').html(d0.rejected);
$('#total').html(d0.total);
$('#val').html(val);
!!status && $('#status').html(status);
}
var d1 = $.Deferred(),
d2 = $.Deferred(),
d3 = $.Deferred(),
d4 = $.Deferred(),
d0 = $.whenAll(d1, d2)
.push(d3)
.done(function(val){updateNumbers(val, 'success!');})
.fail(function(val){updateNumbers(val, 'fail!');});
d1.done(updateNumbers);
d2.done(updateNumbers);
d3.done(updateNumbers);
d4.done(updateNumbers);
d1.resolve(1);
d3.resolve(3);
setTimeout(function(){
d0.push(d4);
}, 1000);
setTimeout(function(){
d4.resolve(4);
}, 2000);
setTimeout(function(){
d2.resolve(2);
}, 3000);
</script>
</body></html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment