Edit in JSFiddle

// function example 

var timeout = function(delay){
    var dfd = Q.defer();
    
    setTimeout(function(){
        $("body").append(delay).append("<br>");
        dfd.resolve(delay);
    }, delay);
    
    return dfd.promise;
};

// qMap

var qMap = function(array, fn){
    
    var dfd = Q.defer();
    var index = 0;
    
    (function next(){
        var item = array[index];
        if(index >= array.length) {
            dfd.resolve();
            return;
        }
        
        index++;
        fn(item).then(next);
        
    })();
    
    return dfd.promise;
        
};

// execute function list

qMap(
    [3000, 2000, 4000],
    timeout)
.then(function(){
    $("body").append("done").append("<br>");
});


              

              

External resources loaded into this fiddle: