JSFiddle - React, Tailwind, and code Playground

by lomatek

HTML

<script src="http://documentcloud.github.com/underscore/underscore-min.js"></script>

JavaScript

$.waterfall = function() {
    var steps   = [],
        dfrd    = $.Deferred(),
        pointer = 0;

    $.each(arguments, function(i, a) {
        steps.push(function() {
            var args = [].slice.apply(arguments), d;

            if (typeof(a) == 'function') {
                if (!((d = a.apply(null, args)) && d.promise)) {
                    d = $.Deferred()[d === false ? 'reject' : 'resolve'](d);
                }
            } else if (a && a.promise) {
                d = a;
            } else {
                d = $.Deferred()[a === false ? 'reject' : 'resolve'](a);
            }

            d.fail(function() {
                dfrd.reject.apply(dfrd, [].slice.apply(arguments));
            })
            .done(function(data) {
                pointer++;
                args.push(data);

                pointer == steps.length
                    ? dfrd.resolve.apply(dfrd, args)
                    : steps[pointer].apply(null, args);
            });
        });
    });

    steps.length ? steps[0]() : dfrd.resolve();

    return dfrd;
}

})(jQuery);

$.waterfall(
function ()
    return $.ajax(url: 'http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js');
)