如何使用callback来等待两个查询asynchronous节点

我正在使用节点中的sql查询asynchronous模块瀑布方法。 我将如何使用callback来发送两组数据到下一个函数。 就像第一个将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); }); 

results将包含来自所有完成function的数据。

这是一个相当简单的例子,有些人可能会承诺promise.all更适合。 就个人而言,当事情变得更复杂时,我发现async.auto确实有帮助。 所以为了保持一致性,我将它用于大多数asynchronous控制stream程,并发现它处理大多数情况。

你可以做一个嵌套的并行调用。 这是一个使用setTimeout的伪示例:

 async.waterfall([ function(callback) { async.parallel({ requestUpdateCheck: function(callback) { setTimeout(function() { callback(null, 'UpdateCheck') }, 500) }, requestCheckDbl: function(callback) { setTimeout(function() { callback(null, 'CheckDbl') }, 500) } }, function(err, result) { // here the parallel op is done callback(err, result); }) }, function(result, callback) { console.log('hi from second from qryUpdateCheck', result.qryUpdateCheck); console.log('hi from second from qryCheckDbl', result.qryCheckDbl); callback(null, result); } ], function(err, result) { // result now equals 'done' console.log('done', result); });