Как правильно прервать цепочку обещаний node.js, используя Q?

Я используюмодуль Q для Node.js в попытках избежать «пирамиды гибели» в сценариях, где у меня много шагов. Например:

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();
}

По сути это, кажется, работает; если на каком-либо из шагов задачи выдается ошибка, она передается в функцию обратного вызова (хотя я буду приветствовать улучшения, поскольку я новичок в обещаниях node.js). Однако у меня есть проблема, когда мне нужно прервать цепочку задач на ранней стадии. Например, если result1 успешно возвращен, я мог бы хотеть вызвать обратный вызов рано и прервать остальное, но мои попытки сделать это терпят неудачу ...

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();
}

В этом примере я вижу как "aborting!" и "делать шаг 3 ..." распечатаны.

Я уверен, что я просто неправильно понимаю некоторые основные принципы, поэтому буду признателен за любую помощь. Спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос