¿Cómo ejecutar secuencialmente las promesas con Q en Javascript?

Estoy teniendo dificultades para ejecutar las promesas de forma secuencial.

var getDelayedString = function(string) {
    var deferred = Q.defer();

    setTimeout(function() {
        document.write(string+" ");
        deferred.resolve();
    }, 500);

    return deferred.promise;
};

var onceUponATime = function() {
    var strings = ["Once", "upon", "a", "time"];

    var promiseFuncs = [];

    strings.forEach(function(str) {
        promiseFuncs.push(getDelayedString(str));
    });

    //return promiseFuncs.reduce(Q.when, Q());
    return promiseFuncs.reduce(function (soFar, f) {
        return soFar.then(f);
    }, Q());    
};

getDelayedString("Hello")
.then(function() {
    return getDelayedString("world!")
})
.then(function() {
    return onceUponATime();
})
.then(function() {
    return getDelayedString("there was a guy and then he fell.")
})
.then(function() {
    return getDelayedString("The End!")
})

onceUponTime () debe mostrar de forma secuencial ["Once", "upon", "a", "time"], pero en lugar de eso, se están emitiendo de forma inmediata por algún motivo.

jsFiddle aquí:http://jsfiddle.net/6Du42/2/

¿Alguna idea de lo que estoy haciendo mal?

Respuestas a la pregunta(1)

Su respuesta a la pregunta