jQuery whenAll method

A method of waiting for all promises to return or a timeout occurs, regardless of failure or success.

by Kato Richardson

HTML

<script src="https://raw.github.com/Zenovations/jQuery-whenAll/master/jquery.whenall.min.js"></script>
<h1>$.when() vs $.whenAll()</h1>

<ul id="log"></ul>

CSS

body {
    font-family: Verdana;
}
h1 {
    font-size: 20px;
    border-bottom: 1px solid black;
    margin: 1em;
}

ul {
    margin: 1em;    
}

li {
    margin: 0.4em;
}

strong {
    font-weight: bolder;
}

span {
   color: red;   
}

JavaScript

var a = $.Deferred(),
    b = $.Deferred(),
    c = $.Deferred(),
    d = $.Deferred();

$.when(a, b, c).always(handle("when", [a, b, c]));
$.whenAll(a, b, c).always(handle("whenAll", [a, b, c]));
$.whenAllExpires(1000, a, b, c, d).always(handle('whenAllExpires', [a, b, c, d]));

a.resolve();
b.reject();
c.resolve();

function log(name, elms, whenAllArray) {
    //console.log(exp);
    var results = [];
    jQuery.each(elms, function(i, e) {
        var letters = 'abcdefg';
        var c = letters[i];
        var state = e.state();
        var exp = whenAllArray && whenAllArray[i];
        switch (e.state()) {
        case 'pending':
            state = '<span>' + (exp || state) + '</span>';
            break;
        case 'rejected':
            e.fail(function(msg) {
                //console.log(e);
                msg && (state = msg);
            });
            break;
        }
        results.push(c + ".state: " + state);
    });
    jQuery("<li/>", {
        html: "<strong>[" + name + "]</strong>:<br />" + results.join('<br />')
    }).appendTo("#log");
}

function handle(name, elms) {
    return function(e) {
        log(name, elms, e);
    }
}