Created
June 16, 2011 23:20
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!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