Javascript 用于多个查询的节点MySql回调
我在试图创建将行添加到我在MySql数据库上创建的新表的逻辑时遇到了一个问题。添加一行时,我需要查询数据库4次以检查其他行,然后向新行添加正确的值。我正在使用node.js和mysql模块来完成这项工作。当我编写代码时遇到了一个障碍,代码在插入新行之前不会等待4个查询完成,这样每次找到的值都会为0。经过一些研究后,我意识到回调函数是合适的,如下所示:Javascript 用于多个查询的节点MySql回调,javascript,mysql,node.js,callback,Javascript,Mysql,Node.js,Callback,我在试图创建将行添加到我在MySql数据库上创建的新表的逻辑时遇到了一个问题。添加一行时,我需要查询数据库4次以检查其他行,然后向新行添加正确的值。我正在使用node.js和mysql模块来完成这项工作。当我编写代码时遇到了一个障碍,代码在插入新行之前不会等待4个查询完成,这样每次找到的值都会为0。经过一些研究后,我意识到回调函数是合适的,如下所示: var n = 0; connection.query("select...", function(err, rows){ if(err)
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条件不应影响此问题。我很清楚只有一个查询等待的回调函数,但对于多个查询等待,我变得有点不知所措。我唯一的想法是创建另一个变量,该变量在调用回调之前递增,然后传入回调函数的参数。然后,在回调内部,查询可以由一个if语句封装,条件是这个变量等于需要调用的查询的数量,这里是4。我可以看出这是可行的,但不确定这种情况是否已经有了内置的解决方案,或者是否已经开发了其他更好的解决方案。您需要
异步
()。您可以使用此模块执行非常复杂的逻辑
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的回答,我建议使用异步库,但是,我可能会建议并行运行(除非第一个查询的结果用作第二个查询的输入)
var async=require('async');
函数runquerys(param1、param2、回调){
async.parallel([query1,query2,query3(param1,param2),query4],
功能(错误、结果){
如果(错误){
回调(err);
返回;
}
var combinedResult={};
对于(var i=0;i
Query3显示了“传递”到查询函数的参数的用法
我相信有人能给我展示一种更好的组合结果的方法,但这是我迄今为止想出的最好的方法。使用临时对象的原因是,传递给回调的“results”参数是一个结果数组,很难确定哪个查询的结果
祝你好运。我知道这将如何解决我的问题,在其他查询之前执行查询,但总体而言,这不是比我描述的方法慢吗?如果我错了,请纠正我的错误,但是异步调用查询并检查是否需要调用更多查询不是比同步调用查询更快吗?我可能不清楚,但4个选择查询不需要有任何顺序。我理解,当时我没有得到问题,但根据这些信息,我正在编辑我的答案;)@yanman1234好了,我刚刚编辑了我的答案,以便同时运行4个查询,并等待所有查询运行最后一个函数。感谢您的帮助。Async看起来确实可以帮助我解决这个问题,我将开始研究它。我喜欢你的答案,但我不太确定你是否可以像那样传递参数。就我个人而言,我使用了
async.apply(query3,param1,param2)
我不知道async.apply,看起来这是传递额外参数的正确方法,而我的方法是黑客。
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);
});
}