node.js - 如何使用 Q 正确中止 node.js promise 链?

标签 node.js promise q

我正在使用 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/

相关文章:

javascript - 在 JavaScript Promise 中正确使用 then

javascript - 如何解决 node.js 中可变数量的 promise

javascript - 如何将 Q Promise 与 finally() 上的先前错误链接起来

node.js - VSCode 将调试附加到在 WSL 上运行的 Nodejs

angularjs - 如何将 session 变量从express/node传递到Angular?

node.js - 调试无服务器框架调用本地函数

node.js - 如何通过 Homebrew 软件安装 LTS 版本的 nodejs

javascript - js : promises inside a while- true loop

javascript - 在级联promise中修改it block 中本地定义的变量时如何修改

angularjs - 如何从 http 拦截器进行广播?