Delayed Deferreds using .delay()

JavaScript

(function($) {
    var delay = function(ms) {
        var dfd = $.Deferred();
        window.setTimeout(dfd.resolve, ms);
        return dfd;
    };
    $.delay = function(ms) {
        return function() {
            return delay(ms);
        };
    };
})(jQuery);

// An example async function
var someAsyncFunc = function() {
    var dfd = $.Deferred();
    console.log("Async function called");
    setTimeout(function() {
        console.log("Async function completed");
        dfd.resolve();
    }, 1000);
    return dfd;
};

// Delayed deferreds
$.Deferred().resolve()
    .pipe(function() {
        console.log("Start!");
    })
    .pipe($.delay(10000))
    .pipe(function() {
        console.log("1 second later");
    })
    .pipe($.delay(1000))
    .pipe(function() {
        console.log("1 second after that");
    })
    .pipe(someAsyncFunc)  // Doesn't resolve for 1 second
    .pipe($.delay(1000))
    .pipe(function() {
        console.log("1 second later");
    })
    .done(function() {
        console.log("Done!");
    });