¿Cómo usar el módulo “q” para refactorizar el código de mangosta?

Estoy usando la mangosta para insertar algunos datos en mongodb. El código se ve como:

<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>

Puedes ver que hay muchas devoluciones de llamadas anidadas allí, así que estoy tratando de usarq para refactorizarlo.

Espero que el código se vea como:

<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>

Pero no sé cómo hacerlo.

Respuestas a la pregunta(5)

Su respuesta a la pregunta