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!