节点MySqlcallback多个查询

我遇到了一个问题,同时试图创build逻辑来添加行到我在MySql数据库上创build的新表。 当添加一行时,我需要查询数据库4次来检查其他行,然后将正确的值添加到新行。 我正在使用node.js和mysql模块来完成这一点。 在编码的时候,我碰到了一个障碍,代码并没有等待4个查询在插入新行之前完成,然后每次都给出值为0的值。 经过一番研究,我意识到一个callback函数会是这样的,看起来像这样:

var n = 0; connection.query("select...", function(err, rows){ if(err) throw err; else{ if(rows.length === 1) ++n; } callback(); }); function callback(){ connection.query("insert...", function(err){ if(err) throw err; }); } 

注意:select查询只能返回一个项目,所以if条件不应该影响这个问题。

只有一个查询等待的callback函数对我来说是很清楚的,但是对于多个查询等待,我有些迷失了方向。 我唯一的想法是在调用callback之前创build另一个增量variables,然后在callback函数的参数中传递。 然后在callback中,查询可以被if语句封装,条件是这个variables等于需要调用的查询的数量,这里是我的目的。 我可以看到这个工作,但不知道这种情况是否已经内置解决scheme,或者是否有其他更好的解决scheme已经开发。

你需要asynchttps://github.com/caolan/async )。 你可以用这个模块做一个非常复杂的逻辑。

 var data = {} //You can do this in many ways but one way is defining a global object so you can add things to this object and every function can see it firstQueryFunction(callback){ //do your stuff with mysql data.stuff = rows[0].stuff; //you can store stuff inside your data object callback(null); } secondQueryFunction(callback){ //do your stuff with mysql callback(null); } thirdQueryFunction(callback){ //do your stuff with mysql callback(null); } fourthQueryFunction(callback){ //do your stuff with mysql callback(null); } //This functions will be executed at the same time async.parallel([ firstQueryFunction, secondQueryFunction, thirdQueryFunction, fourthQueryFunction ], function (err, result) { //This code will be executed after all previous queries are done (the order doesn't matter). //For example you can do another query that depends of the result of all the previous queries. }); 

根据Gesper的回答,我build议使用asynchronous库,但是,我可能会推荐并行运行(除非第一个查询的结果用作第二个查询的input)。

 var async = require('async'); function runQueries(param1, param2, callback) { async.parallel([query1, query2, query3(param1, param2), query4], function(err, results) { if(err) { callback(err); return; } var combinedResult = {}; for(var i = 0; i < results.length; i++) { combinedResult.query1 = combinedResult.query1 || result[i].query1; combinedResult.query2 = combinedResult.query2 || result[i].query2; combinedResult.query3 = combinedResult.query3 || result[i].query3; combinedResult.query4 = combinedResult.query4 || result[i].query4; } callback(null, combinedResult); }); } function query1(callback) { dataResource.Query(function(err, result) { var interimResult = {}; interimResult.query1 = result; callback(null, interimResult); }); } function query2(callback) { dataResource.Query(function(err, result) { var interimResult = {}; interimResult.query2 = result; callback(null, interimResult); }); } function query3(param1, param2) { return function(callback) { dataResource.Query(param1, param2, function(err, result) { var interimResult = {}; interimResult.query3 = result; callback(null, interimResult); }); } } function query4(callback) { dataResource.Query(function(err, result) { var interimResult = {}; interimResult.query4 = result; callback(null, interimResult); }); } 

Query3显示使用查询函数“传递”的参数。

我敢肯定,有人可以给我一个更好的方法来结合这个结果,但这是迄今为止我所提出的最好的方法。 使用临时对象的原因是传递给callback函数的“results”参数是一个结果数组,可能很难确定哪个结果是哪个查询。

祝你好运。