Como anular corretamente uma cadeia de promessas node.js usando Q?

estou a usaro módulo Q para o Node.js na tentativa de evitar a "pirâmide da desgraça" em cenários em que eu tenho muitas etapas. Por exemplo:

function doTask(task, callback)
{
    Q.ncall(task.step1, task)
    .then(function(result1){
        return Q.ncall(task.step2, task);
    })
    .then(function(result2){
        return Q.ncall(task.step3, task);
    })
    .fail(callback).end();
}

Essencialmente isso parece funcionar; Se um erro for lançado por qualquer uma das etapas da tarefa, ele será passado para o retorno de chamada (embora eu seja bem-vindo para melhorias, como eu sou novo em promessas node.js). No entanto, tenho um problema quando preciso abortar a cadeia de tarefas mais cedo. Por exemplo, se result1 for retornado com êxito, talvez eu queira chamar o retorno de chamada antecipadamente e abortar o restante, mas minhas tentativas de fazê-lo estão falhando ...

function doTask(task, callback)
{
    Q.ncall(task.step1, task)
    .then(function(result1){
        if(result1)
        {// the rest of the task chain is unnecessary 
            console.log('aborting!');
            callback(null, result1);
            return null;
        }
        return Q.ncall(task.step2, task);
    })
    .then(function(result2){
        console.log('doing step 3...');
        return Q.ncall(task.step3, task);
    })
    .fail(callback).end();
}

Neste exemplo, vejo ambos "abortando!" e "fazendo o passo 3 ..." impresso.

Tenho certeza de que estou apenas interpretando mal alguns princípios básicos aqui, então apreciaria qualquer ajuda. Obrigado!

questionAnswers(3)

yourAnswerToTheQuestion