Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript nodejs mysql,循环查询_Javascript_Mysql_Node.js - Fatal编程技术网

JavaScript nodejs mysql,循环查询

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

我现在有点目瞪口呆。我对nodejs和javaScript还不太熟悉,但我无法理解这一点。我想这是因为对mysql的查询是异步的

我举了一个例子来说明我的问题。我只想循环一些sql查询,并对结果进行处理。为了这个例子,我只是打印了一些东西。我知道我可以使用这样一个sql查询
“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);
  });
};