Como usar o módulo “q” para refatorar o código do mongoose?

Estou usando o mangusto para inserir alguns dados no mongodb. O código parece:

<code>var mongoose = require('mongoose');
mongoose.connect('mongo://localhost/test');
var conn = mongoose.connection;

// insert users
conn.collection('users').insert([{/*user1*/},{/*user2*/}], function(err, docs) {
    var user1 = docs[0], user2 = docs[1];

    // insert channels
    conn.collection('channels').insert([{userId:user1._id},{userId:user2._id}], function(err, docs) {
        var channel1 = docs[0], channel2 = docs[1];

        // insert articles
        conn.collection('articles').insert([{userId:user1._id,channelId:channel1._id},{}], function(err, docs) {
            var article1 = docs[0], article2 = docs[1];

        }
    });
};
</code>

Você pode ver que há muitos callbacks aninhados lá, então estou tentando usarq refatorá-lo.

Espero que o código seja parecido com:

<code>Q.fcall(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function (value4) {
    // Do something with value4
}, function (error) {
    // Handle any error from step1 through step4
})
.end();
</code>

Mas eu não sei como fazer isso.

questionAnswers(5)

yourAnswerToTheQuestion