Set timer using deferred object

Alternative to setTimeout delays using deferred object.

by FiNGAHOLiC

HTML

<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
<div class="box"></div>

CSS

.box{
    width:50px;
    height:50px;
    position:absolute;
    top:0;
    left:0;
    z-index:1;
    background:#c00;
}

JavaScript

// http://msdn.microsoft.com/en-us/scriptjunkie/gg723713

$.createCache = function(requestFunction){
    var cache = {};
    return function(key, callback){
        if(!cache[key]){
            cache[key] = $.Deferred(function(defer){
                requestFunction(defer, key);
            }).promise();
        };
        return cache[key].done(callback);
    };
};

var readyTime;

$(function(){
    readyTime = $.now();
    console.log(readyTime);
});

$.afterDOMReady = $.createCache(function(defer, delay){
    delay = delay || 0;
    $(function(){
        var delta = $.now() - readyTime;
        if(delta >= delay){
            defer.resolve();
        }else{
            setTimeout(defer.resolve, delay - delta);
        };
    });
});

$(function(){
    var $box = $('.box');
    $.afterDOMReady(5000).done(function(){
        $box.animate({
            left : 200
        });
    });
});