Javascript 在函数中无序执行语句的节点

Javascript 在函数中无序执行语句的节点,javascript,node.js,node-mysql,Javascript,Node.js,Node Mysql,我使用nodemysql执行查询并返回结果。根据标准mysql节点文档,一旦查询完成并传递错误对象或结果对象,就会执行回调函数。假设查询执行正确,并且确实执行了。我在结果上运行for-in循环,并将每行中的字段分配为一条连续消息,我计划将该消息发送回调用,以便对其进行适当的处理。因此,如果用户希望查看幻想足球选秀中的最后5次选秀,函数将接收等于5的num参数,然后查看返回的消息,其中显示所有5次选秀交易的详细信息。功能如下: exports.getSelections = function(nu

我使用nodemysql执行查询并返回结果。根据标准mysql节点文档,一旦查询完成并传递错误对象或结果对象,就会执行回调函数。假设查询执行正确,并且确实执行了。我在结果上运行for-in循环,并将每行中的字段分配为一条连续消息,我计划将该消息发送回调用,以便对其进行适当的处理。因此,如果用户希望查看幻想足球选秀中的最后5次选秀,函数将接收等于5的num参数,然后查看返回的消息,其中显示所有5次选秀交易的详细信息。功能如下:

exports.getSelections = function(num){


 var query = "Select b.Player, b.Team, b.Position, a.Pick, c.Owner FROM Players b, Owners c,(Select * FROM Draft2 WHERE Year=2015 AND Player_ID >0 ORDER BY PICK DESC LIMIT " + num + ") a WHERE b.Player_ID = a.Player_ID AND c.Owner_ID = a.Owner_ID ORDER BY a.Pick DESC";


 var connection = mysql.createConnection(EXTERNAL_DATABASE_URL);
 connection.query(query, function(err, results, fields){
                    if(!err){
                        for( var i in results){
                            msg += "\n" + results[i].Pick + ". " + results[i].Owner + " selected " + results[i].Player + ",  " + results[i].Position + " from " + results[i].Team 
                        }

                    }else{
                        console.log(err);
                            msg = "There was an error processing your request";
                    }
                });      


                    connection.end(function(err){
                        if(err){
                            console.log("there was an error")
                        }else{
                            console.log("close connection");
                        }
                    });




                        console.log("message to be sent: " + msg);
                        return msg;         

};
通过我的控制台的输出总是:

要发送的消息:未定义

这就是已处理的内容:[根据传递给函数并在查询中使用的编号显示销售交易记录的详细信息]

我在上面的第二行看到了查询结果,如[msg]所示,因此我知道查询是正确执行的

以下是我的问题:

我可以得到一个解释,为什么控制台会在完成实际循环之前执行要发送的消息

如果我想在返回值之前确保循环是完整的,我该如何处理这个问题

此外,connection.end似乎也不执行。我想我退出函数太早了


感谢您的帮助。

正如@Pointy所暗示的,日志是在循环完成之前执行的,因为数据库操作connection.query是异步的。您的所有操作都以正确的顺序执行;它只是异步操作在它们自己的时间轴上解析,这就是为什么我们有在它们完成时运行的回调

在connection.query回调有机会运行之前,您已经记录了msg的值

尝试将要发送的消息移动到connection.query操作的回调中的console.log中:

exports.getSelections = function(num) {
  var query = "Select b.Player, b.Team, b.Position, a.Pick, c.Owner FROM Players b, Owners c,(Select * FROM Draft2 WHERE Year=2015 AND Player_ID >0 ORDER BY PICK DESC LIMIT " + num + ") a WHERE b.Player_ID = a.Player_ID AND c.Owner_ID = a.Owner_ID ORDER BY a.Pick DESC";
  var connection = mysql.createConnection(EXTERNAL_DATABASE_URL);
  connection.query(query, function(err, results, fields) {
    if (!err) {
      for (var i in results) {
        msg += "\n" + results[i].Pick + ". " + results[i].Owner + " selected " + results[i].Player + ", " + results[i].Position + " from " + results[i].Team
      }
    } else {
      console.log(err);
      msg = "There was an error processing your request";
    }

    console.log("message to be sent: " + msg);

  });
  connection.end(function(err) {
    if (err) {
      console.log("there was an error")
    } else {
      console.log("close connection");
    }
  });

  return msg;
};

另外,在与msg+=?你发布的代码中没有循环。数据库操作是异步的;这就是为什么你通过回调来处理结果。你能发布你的完整代码吗?似乎存在一些缩进和可能的范围问题。我所指的循环是结果中的forvar I。对于给定的代码,如果查询成功完成但结果集为空,则msg将未定义。它没有任何空结果集。用户可以请求数据库表中的最后5、10等记录。num参数被传递给函数并在查询中使用。当一个数字被传递时,我看到了结果,但看起来代码在完成for in循环(该循环正在填充msg变量)之前正在计算console.logmessage要发送的消息:msg。我确实尝试过,但运气不太好。在发布代码更新后不久,我确实让它开始工作,但我必须通过在调用函数中创建回调并将其作为主函数参数的一部分进行传递来完成。我应该能够从上面显示的主函数中返回msg变量吗?