JavaScript nodejs mysql,循环查询
我现在有点目瞪口呆。我对nodejs和javaScript还不太熟悉,但我无法理解这一点。我想这是因为对mysql的查询是异步的 我举了一个例子来说明我的问题。我只想循环一些sql查询,并对结果进行处理。为了这个例子,我只是打印了一些东西。我知道我可以使用这样一个sql查询JavaScript nodejs mysql,循环查询,javascript,mysql,node.js,Javascript,Mysql,Node.js,我现在有点目瞪口呆。我对nodejs和javaScript还不太熟悉,但我无法理解这一点。我想这是因为对mysql的查询是异步的 我举了一个例子来说明我的问题。我只想循环一些sql查询,并对结果进行处理。为了这个例子,我只是打印了一些东西。我知道我可以使用这样一个sql查询“SELECT id,name FROM player WHERE id IN(1,2,3,4,5)”,但这在我试图编写的实际应用程序中是不可能的 这是我的nodejs app.js的相关部分 var mysql = requ
“SELECT id,name FROM player WHERE id IN(1,2,3,4,5)”
,但这在我试图编写的实际应用程序中是不可能的
这是我的nodejs app.js的相关部分
var mysql = require("mysql");
var mysqlPool = mysql.createPool(conf.mysqlArbData);
for (var i = 0; i<5; i++){
mysqlPool.getConnection(function(err, connection) {
var detailSql = "SELECT id, name FROM player " +
"WHERE id = "+i;
if (err){
throw err;
}
connection.query(detailSql, function(err, detailRows, fields) {
connection.end();
console.log("detailSql="+detailSql);
if (err){
console.log("can't run query=" + detailSql +"\n Error="+err);
}
else{
console.log(detailRows[0].id + " " +detailRows[0].name);
}
});
});
};
我的问题是,为什么我只得到id=5的数据库条目的结果?为了在回调中接收每个单独的结果,需要更改哪些内容?问题在于
getConnection
是异步的,Javascript没有块作用域,这意味着在调用getConnection
的回调时,i
变量将指向循环中最后一个变量的值(即5)
您可以使用技巧为循环的每一圈创建一个分部函数(将其视为已应用第一个参数的函数),该函数将传递当前值i
作为getConnection
回调的第一个参数:
for (var i = 0; i<5; i++) {
mysqlPool.getConnection(function(i, err, connection) {
...
}.bind(mysqlPool, i));
};
for(var i=0;i对于节点,您可以使用语句。它限制for循环中的i
范围
for (let i = 0; i<5; i++) {
mysqlPool.getConnection(function(err, connection) {
console.log(i);
});
};
for(让我=0;我谢谢你。我会尽快尝试你建议的解决方案。关于并发查询的提示很有帮助,但我认为连接池初始化时最多有10个并发连接。我希望更多的连接都会排队。最后,从0开始的索引没有问题,只是我的一个错误,我应该已经写了[0,1,2,3,4]绑定多个参数怎么样?@GameDevGuru函数(arg1,arg2,err,connection){…}.bind(mysqlPool,i,j)
@robertklep我使用了数组方法。看起来感觉更干净
for (let i = 0; i<5; i++) {
mysqlPool.getConnection(function(err, connection) {
console.log(i);
});
};