【问题标题】:How do we sent data to local variable in node js async with DB Calls我们如何通过数据库调用将数据发送到节点 js 中的局部变量
【发布时间】:2017-10-23 16:43:30
【问题描述】:

我是 javascript 异步编程的新手,我有一个基本问题,我有一组代码,我正在根据请求正文参数执行两个单独的数据库调用。 这是执行 DB 调用并返回 Promise 的两种方法

  1. 验证考试
  2. 验证用户存在

我想将异步调用的结果存储到这个 myExam 变量中,然后在响应中返回它。

getExam: function(req, res) {
    var myExam = {};
    var coupon = req.body.coupon;
    var email = req.body.email;


    async.series([
        function(callback) {
            validateExam(coupon)
                .then(function(success) {

                    callback(null, success);
                });
        },
        function(callback) {
            validateUserExists(email)
                .then(function(result) {
                    callback(null, result);
                })
        }
    ], function(error, results) {
        myExam.res = results;

    });


    res.json({
        "status": 400,
        "message": myExam
    });
},

【问题讨论】:

  • res.json 应该在 async.series 的回调函数中。正下方 myExam.res = 结果

标签: javascript node.js asynchronous async.js asynccallback


【解决方案1】:

您不能从函数中返回异步检索的值。您的函数在异步操作完成之前返回。相反,您需要通过返回的 Promise 或通过传入一个可以在异步操作完成时调用的回调将返回值传回给调用者。有关详细信息的更多信息,请参阅:How do I return the response from an asynchronous call?

另外,使用 async 库来管理两个 promise 操作是很奇怪的。 Promise 具有内置的所有工具来管理异步操作,因此如果您的核心操作已经返回 Promise,您应该直接使用这些 Promise,而不涉及异步库。

在查看您的代码时,验证考试和验证用户似乎是独立的操作,您可以并行运行它们并使用Promise.all() 了解两个承诺何时完成。

你可以这样做:

getExam: function(req, res) {
    var coupon = req.body.coupon;
    var email = req.body.email;

    Promise.all([validateExam(coupon), validateUserExists(email)]).then(function(results) {
        // results is a two element array that contains the two validation results
        // send your response here based on the results array (not clear to me exactly what you want here)
        res.json(...);
    }).catch(function(err) {
        // return some sort of error response here
        res.status(500).json(...);
    });
},

【讨论】:

  • 实际上我的问题是我们将如何编写业务逻辑,假设我有一个用例,我需要进行多个数据库调用,并且这些数据库调用一个接一个地同步。你建议用上面提到的方式写下来吗?
  • @Sanjay-Dev - 也许你是新来的,但是这个站点不能很好地作为一个教程站点来提出问题并尝试学习一般主题。相反,您需要一个特定的问题,您发布您试图开始工作的代码,我们会帮助您提供特定的解决方案。这就是我为您在答案中发布的代码所做的。 Promise 可用于以您需要的任何方式(并行、顺序或任何组合)协调异步操作。我为您提供了并行运行的操作的答案,因为您显示的代码不需要对这些操作进行排序。
  • @Sanjay-Dev - 当并行操作可行时,并行运行异步操作几乎总是比按顺序运行要快。关于如何使用 Promise 对操作进行排序,这里已经有很多关于堆栈溢出的答案。这是关于排序异步操作的一个答案:stackoverflow.com/questions/29880715/…。还有很多其他的。如果您需要帮助排序异步操作,请在需要同步的实际代码中发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2020-07-06
  • 1970-01-01
相关资源
最近更新 更多