javascript - Node js 中的多个 Promise

标签 javascript node.js promise q

我是 Nodejs 新手,正在努力寻找以下代码的问题。

我想要实现的目标是,依次调用几个方法,如果所有调用都成功,则返回成功,否则如果任何方法失败,则抛出错误。

我遇到的问题是,在所有方法执行之前,即使尚未履行 promise ,主方法也会终止。

主要方法

processRequest(neworder).then(function (done) {
    console.log('Successfully processed the order' + done);
    res.sendStatus(200);
}).fail(function (error) {
    res.status(404).send(error);
})

其他方法调用

module.exports.processRequest = function (Order) {
    var deferred = Q.defer();

    findX(Order)
        .then(findYBasedOnPrevOutput)
        .then(findZBasedOnPrevOutput)
        .then(deferred.resolve())
        .fail(function (err) {
            console.log('Failed to process request' + err);
            deferred.reject(err);
        });

    return deferred.promise;
}


var findX = function (order) {
    var deferred = Q.defer()

    db.list(order, function (address) {
        console.log('Query success');
        if (address == null)
            deferred.reject('Error');
        else {
            deferred.resolve(address);
        }
    })

    return deferred.promise;
};

我遇到的问题是,我在调用 findX 方法后在控制台中看到成功。我预计 findZ 方法后会出现成功消息。

您能否帮我找到上述代码的问题,感谢您在这方面的意见/建议

为了简单起见,我没有在这里分享其他模块,但它们与 findX 非常相似

最佳答案

我建议您只使用已有的 Promise,而不是创建一个新的 Promise,这样既更高效,又可以避免 Promise 反模式:

module.exports.processRequest = function (Order) {
  return findX(Order)
    .then(findYBasedOnPrevOutput)
    .then(findZBasedOnPrevOutput)
    .fail(function (err) {
      // log the error, then throw it again so it is returned as a rejected promise
      console.log('Failed to process request' + err);
      throw(err);
    });
}

并且,我建议更改 findX 以使用 Q 的功能将标准异步调用转换为返回如下 promise 的调用:

var findX = function(order) {
  return Q.nfcall(db.list.bind(db), order);
};
<小时/>

或者,将两者结合起来,如下所示:

module.exports.processRequest = function (Order) {
  return Q.nfcall(db.list.bind(db), Order)
    .then(findYBasedOnPrevOutput)
    .then(findZBasedOnPrevOutput)
    .fail(function (err) {
      // log the error, the throw it again so it is returned as a rejected promise
      console.log('Failed to process request' + err);
      throw(err);
    });
}

关于javascript - Node js 中的多个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33803434/

相关文章:

promise - 如何检测多个pdf.js渲染任务已完成

javascript - Node.js promise 和异步异常

javascript - 从 promise 中获取号码

mysql - 其余API : Inserting value to MySQL database with ExpressJS

javascript - ES6 中解构对象作为参数

javascript 将 --- 替换为 -

javascript - 在流体模式下限制videojs的高度

mysql - Node 在并行执行时创建新的 mysql 连接,并且不会结束新连接

node.js - Express js 使用 mongodb 中的值到查询之外

javascript - 尝试清除 javascript 函数中文本框中的值