Here's an contrived example of what's going on:
HTML:
Click me!
JavaScript:
function getSomeDeferredStuff() { var deferreds = []; var i = 1; for (i = 1; i <= 10; i++) { var count = i; deferreds.push( $.post('/echo/html/', { html: "Task #" + count + " complete.", delay: count }).success(function(data) {
$("div").append(data); })); } return deferreds;}$(function() { $("a").click(function() { var deferreds = getSomeDeferredStuff(); $.when(deferreds).done(function() { $("div").append("All done!
"); }); });});
I want "All done!" to appear after all of the deferred tasks have completed, but $.when()
doesn't appear to know how to handle an array of Deferred objects. "All done!" is happening first because the array is not a Deferred object, so jQuery goes ahead and assumes it's just done.
I know one could pass the objects into the function like $.when(deferred1, deferred2, ..., deferredX)
but it's unknown how many Deferred objects there will be at execution in the actual problem I'm trying to solve.
| To pass an array of values to any function that normally expects them to be separate parameters, use $.when.apply($, my_array); See |