我想运行select语句,然后存储结果。但是我不想把它们联合在一起。
我有这个:
function downloaddata() {
connection.query("SELECT * FROM players", function(err, rows, fields) {
if (err) {
console.log(err.message);
} else {
downloadwalls(rows);
}
});
}
function downloadwalls(playerdata) {
connection.query("SELECT * FROM walls", function(err, rows, fields) {
if (err) {
console.log(err.message);
} else {
downloadprojectiles(playerdata, rows);
}
});
}
function downloadprojectiles(playerdata, walldata) {
connection.query("SELECT * FROM projectiles", function(err, rows, fields) {
if (err) {
console.log(err.message);
} else {
gamedata = {
data : playerdata,
walls : walldata,
projectiles : rows
};
downloaddata();
}
});
}
我基本上将函数链接到完成时调用下一个函数,然后永远重复它。
有没有办法可以将它们组合起来像
connection.query("SELECT * FROM walls; SELECT * FROM ...; SELECT * FROM ...", function(err, rows, fields) {
// here 'rows' would be an array of arrays of rows...
});
请注意,每个表都有不同的列,因此我无法将它们合并。
有人知道某种方式吗?
答案 0 :(得分:0)
这是一个很好的新版本的Forkbomb,只是它填充堆栈线性而不是exponentiell。或者有node.js Tail Recursion Detection?
技术解决方案:绝对从函数中删除链接调用。除去这些功能之外,它们无法提供帮助,因为您现在无法从外部拨打电话。
function load_data{
while(true){
connection.query("SELECT * FROM players", function(err, rows, fields) {
if (err) {
console.log(err.message);
} else {
gamedata['data'] = rows;
}
});
connection.query("SELECT * FROM walls", function(err, rows, fields) {
if (err) {
console.log(err.message);
} else {
gamedata['walls'] = rows;
}
});
connection.query("SELECT * FROM projectiles", function(err, rows, fields) {
if (err) {
console.log(err.message);
} else {
gamedata['projectiles'] = rows
}
});
}
}
但不要期望服务器对此感到高兴!
绝对考虑一下Redis-Message-Subscribe方案,以及#34;新的"问题,因为你会阻塞node.js和MySQL-Server上的整个CPU。将数据存储在数据库中并发送消息。我认为node.js甚至带来了一些很好的消息传递信息来同步服务器之间的数据。
如果你必须通过MySQL来做,那么创建一个"差异"表和存储每个插入,删除,更新玩家,墙壁,射弹和#34;差异"表通过触发器。当5个用户处于非活动状态且1个处于活动状态时,您只需要阅读此单个更新播放器。所以diff表可以作为Message表使用,你可以删除看到的消息。