node.js - 如何使用回调等待两个查询异步 Node

标签 node.js express asynchronous callback async.js

我正在使用异步模块 waterfall 方法在 Node 中进行 SQL 查询。我将如何使用回调将两组数据发送到下一个函数。正如第一个函数将 qryUpdateCheck 和 qryCheckDbl 传递给下一个函数一样。如何正确完成此操作。

async.waterfall([
    function (callback) {
        var requestUpdateCheck = new sql.Request([config]);
        requestUpdateCheck.query("Some qryUpdateCheck", function (err, qryUpdateCheck) {
            console.log('qryUpdateCheck', qryUpdateCheck);    
        });

        var requestCheckDbl = new sql.Request([config]);
        requestCheckDbl.query("Some qryRequestCheckDbl", function (err, recordset) {
            console.log('qryCheckDbl', qryCheckDbl);    
        });

        callback(null, qryUpdateCheck, qryCheckDbl);
    },
    function (qryUpdateCheck, qryCheckDbl, callback) {
        console.log('hi from second from qryUpdateCheck', qryUpdateCheck);
        console.log('hi from second from qryCheckDbl', qryCheckDbl);
        if ((qryUpdateCheck.length == 1) && (qryCheckDbl.length == 0)) {
            var requestUpdateLocID = new sql.Request([config]);

            requestUpdateLocID.query("Last qryUodateLocID", function (err, recordset) {
                console.log('qryUpdateLocID', recordset);
                callback(null, recordset);
            });
        } else if ((qryUpdateCheck.length == 0) && (qryCheckDbl.length == 0)) {
            var requestUpdateLocID = new sql.Request([config]);
            requestUpdateLocID.query("Insert qry", function (err, recordset) {
                console.log('qryUpdateLocID', recordset);
                callback(null, recordset);
            });
        }
    }
], function (err, result) {
  // result now equals 'done'
  console.log('done', result);
});

最佳答案

我找到async.auto对于这样的情况更好。您向其传递一个带有一组函数的对象,对于每个函数,您可以将其他函数名称作为依赖项传递。然后,它将运行任何可以并行的任务,同时确保具有依赖项的函数等到它们全部满足后才被调用。这有点像魔法。

var request = new sql.Request([config]);
async.auto({
  // this runs in parallel because it has no dependencies
  requestUpdateCheck: function(callback) {
    request.query("Some qryUpdateCheck", callback);
  },
  // this also runs in parallel because it has no dependencies
  requestCheckDbl: function(callback) {
    request.query("Some qryRequestCheckDbl", callback);
  },
  // this waits for the first two functions and then executes
  requestUpdateLocID: ['requestUpdateCheck', 'requestCheckDbl', function(results, callback) {
    console.log('Results from requestUpdateCheck and requestCheckDbl', JSON.stringify(results, null, 2));
    var qryUpdateCheck = results.requestUpdateCheck;
    var qryCheckDbl = results.requestCheckDbl;
    if ((qryUpdateCheck.length == 1) && (qryCheckDbl.length == 0)) {
      request.query("Last qryUodateLocID", function (err, recordset) {
        console.log('qryUpdateLocID', recordset);
        callback(err, recordset);
      });
    } else if ((qryUpdateCheck.length == 0) && (qryCheckDbl.length == 0)) {
      request.query("Insert qry", function (err, recordset) {
        console.log('qryUpdateLocID', recordset);
        callback(err, recordset);
      });
    }
  }]
}, function(err, results) {
  console.log('done:', err || results);
});

结果将包含所有已完成函数的数据。

这是一个非常简单的示例案例,有些人可能会认为 promises.all更适合。就我个人而言,我发现当事情变得更加复杂时,async.auto确实很有帮助。因此,为了保持一致性,我将它用于大多数异步控制流,并发现它可以处理大多数情况。

关于node.js - 如何使用回调等待两个查询异步 Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42305006/

相关文章:

ruby - 一个TCPSocket,两个线程

javascript - promise 的连接不返回任何内容 (JS)

node.js - node.js openCV 基础教程

node.js - 简单对等。 ("signal") 事件重复多次

javascript - "Can' t 发送后设置 header "Node.js

mysql - Sequelize - 表多元化错误,表中没有实例

java - 使用 EJB 异步方法的正确方法

node.js - 使用 TFS 2015 运行 Jest 单元测试

javascript - ExpressJS 中的 Promise 返回错误

c# - 在C#.NET4应用程序中在后台处理多个输入