我正在使用 the Q module对于 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();
}
在这个例子中,我看到两个“正在中止!”并打印“正在执行第 3 步...”。
我确定我只是误解了这里的一些基本原则,因此希望能提供任何帮助。谢谢!
最佳答案
在这种情况下,您需要进行分支,这确实意味着嵌套或创建子例程。
function doTask(task, callback) {
return Q.ncall(task.step1, task)
.then(function(result1) {
if (result1) return result1;
return Q.ncall(task.step2, task)
.then(function(result2) {
return Q.ncall(task.step3, task);
})
})
.nodeify(callback)
}
或者
function doTask(task, callback) {
return Q.ncall(task.step1, task)
.then(function(result1) {
if (result1) {
return result1;
} else {
return continueTasks(task);
}
})
.nodeify(callback)
}
function continueTasks(task) {
return Q.ncall(task.step2, task)
.then(function(result2) {
return Q.ncall(task.step3, task);
})
}
关于node.js - 如何使用 Q 正确中止 node.js promise 链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11302271/