Я использую the Q module для Node.js в попытках избежать «пирамиды обречения» в сценариях, где у меня много шагов. Например:Как правильно прервать цепочку обещаний node.js, используя Q?
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();
}
В этом примере я вижу, как «отбрасывание!» и «сделать шаг 3 ...».
Я уверен, что я просто недопонимаю некоторые основные принципы здесь, поэтому буду признателен за любую помощь. Благодаря!
Одно решение, которое я нашел, чтобы создать отдельное обещание цепи после первой цепи может сломаться. Чем в приведенном выше примере утверждение .then с результатом2 присоединяется к Q.ncall для шага 2 вместо того, чтобы быть привязанным к первоначальному обещанию. ОДНАКО, основным недостатком здесь является то, что он избавляется от одного из основных преимуществ для Q, на мой взгляд: избегая пирамиды гибели! Это все же лучше, чем никаких обещаний, но мне не нравится решение ... –