Can someone explain the following code for me?

I'm trying to understand Promise. But here I'm confused. I want to create a test function that will print 3000 after 3 second, then print 2000 after 2 second, then print 1000 after 1 second. Here is my code:

'use strict';
var Q = require('q');

function delayConsole(timeOut) {
    var defer = Q.defer();
    setTimeout(function(){
        console.log(timeOut);
        defer.resolve(2000);
    },timeOut);
    return defer.promise;
}

// This works
delayConsole(3000).then(function(){
    return delayConsole(2000);
}).then(function(){
    return delayConsole(1000);
    });

// This doesn't work. Why?
delayConsole(3000).then(delayConsole(2000)).then(delayConsole(1000));

There, you call the function delayConsole immediately :

.then(delayConsole(2000))

That is : you don't pass the function but the result of the function call, you don't wait for the promises to be chained.

When you do

then(function(){
    return delayConsole(2000);
})

then you pass a function, not the result of that function call. The function can be called when the previous element in the promise chain is solved.

I just thought I'd share that you can make this construction work which is sometimes easier to use:

promise.then(delayConsole(3000)).then(delayConsole(2000)).then(delayConsole(1000));

by changing delayConsole() to this:

function delayConsole(timeOut) {
    return function() {
        var defer = Q.defer();
        setTimeout(function(){
            console.log(timeOut);
            defer.resolve(2000);
        },timeOut);
        return defer.promise;
    }
}

This way, calling delayConsole() just captures the timeout argument and returns a function that can be called later by the promise .then handler. So, you are still passing a function reference to the .then() handler which lets the promise engine call the internal function sometime later rather than execute it now.