jQuery Deferred Piping

by ryanwheale

JavaScript

$(function () {
    var deferreds = {};
    
    function createDeferreds() {
        var num = 3;
        while (num--) {
            (function (num) {
                num++;
                deferreds["def" + num] = $.Deferred().done(function (results) {
                    console.log("Deffered", num, "resolved.", results);
                }).fail(function (results) {
                    console.log("Deffered", num, "failed.", results);
                });
            }(num));
        }
    }
    
    function returnDef (num) {
        return function() {
            console.log(" - returning def", num);
            return deferreds["def" + num];
        };
    }
    
    function resolveDef (num) {
        deferreds["def" + num].resolve("Resolved #" + num);
    }
    
    function rejectDef (num) {
        deferreds["def" + num].reject("~~ Rejected #" + num);
    }
    
    function allDone (results) {
        console.log("ALL DONE:", results);
    }
    
    function handleFail (message) {
        console.log("SOMETHING WENT WRONG:", message);
    }
    
    var tests = {
        passOne: function () {
            deferreds.def1.done(allDone);
            resolveDef(1);
        },
        
        allPass: function () {
            deferreds.def1
                .then(returnDef(2))
                .then(returnDef(3))
                .done(allDone);
            
            resolveDef(1);
            resolveDef(2);
            resolveDef(3);
        },
        
        allPassWithDone: function () {
            deferreds.def1
                .done(returnDef(2))
                .done(returnDef(3))
                .done(allDone);
            
            resolveDef(1);
            resolveDef(2);
            resolveDef(3);
        },
        
        failTwo: function() {
            deferreds.def1
                .then(returnDef(2))
                .then(returnDef(3))
                .done(allDone)
                .fail(handleFail);
            
           ...