我使用node-mysql来执行查询并返回结果。根据标准的mysql-node文档,一旦查询完成,就会在传递错误对象或结果对象时执行回调函数。假设查询正确执行(确实如此)。我在结果上运行for-in循环,并将每行中的字段分配为一条连续的消息,我计划将其发送回调用,以便可以对其进行适当处理。因此,如果用户想要查看幻想足球选秀中的最后5个选秀权,则该功能将接收num参数(等于5),然后查看返回的消息,其中显示有关所有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也没有执行。我认为我太早退出这个功能了?
感谢您的帮助。
答案 0 :(得分:0)
正如@Pointy暗示的那样,日志在循环完成之前正在执行,因为数据库操作connection.query
是异步。所有操作都按正确的顺序执行;只是异步操作在他们自己的时间轴上解析,这就是为什么我们有完成后运行的回调。
在msg
回调甚至有机会运行之前,您已经记录了connection.query
的值。
尝试在console.log
操作的回调中移动“要发送的消息”connection.query
:
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
连接之前,可能需要确保String
的类型为msg += "..."