SO - 24931115

JavaScript

var arr = [syncFunction, returnsPromiseAsync, syncFunc2, returnsPromiseAsync];

clearQueue(arr).then(function() {
    console.log("All done");
});
console.log("After, but sync!");

function clearQueue(q) {
    var p = $.Deferred();
    setTimeout(p.resolve.bind(p), 0);
    
    return q.reduce(function(prev,cur){ 
        return prev.then(cur);
    }, p);
}

function syncFunction(){
    console.log("Hello World 1");    
}
function returnsPromiseAsync(){
    var d = $.Deferred();    
    setTimeout(function(){ console.log("2"); d.resolve(""); },1000);
    return d.promise();
}
function syncFunc2(){
    console.log("Hello World 3");    
}