whenAll jQuery Plugin

jQuery plugin to signal when multiple defers (usuaylly Ajax calls) are finished no matter their resolution.

by baohouse

JavaScript

(function ($) {
    $.whenAll = function (deferreds) {
        var lastResolved = 0;
        var wrappedDeferreds = [];

        for (var i = 0; i < deferreds.length; i++) {
            wrappedDeferreds.push($.Deferred());
            if (deferreds[i] && deferreds[i].always) {
                deferreds[i].always(wrappedDeferreds[lastResolved++].resolve);
            } else {
                wrappedDeferreds[lastResolved++].resolve(deferreds[i]);
            }
        }

        return $.when.apply($, wrappedDeferreds).promise();
    };
}(jQuery));

var goodDfd = new $.Deferred();
var badDfd = new $.Deferred();

$.whenAll([1, null, goodDfd, badDfd])
   .done(
       function(result1, result2, result3, result4) {
           $('body').append(result1);
           $('body').append("<br/>");
           $('body').append(result2);
           $('body').append("<br/>");
           $('body').append(result3);
           $('body').append("<br/>");
           $('body').append(result4);
       });

setTimeout(function () {
    goodDfd.resolve("Good, resolved after 500ms");
}, 500);

setTimeout(function () {
    badDfd.reject("Bad, rejected after 1000ms");
}, 1000);