为什么新的 Monsters 对象仅在 mysql 函数作用域内调用时才被填充?
Monsters = {};
db.query('SELECT * from rpg_monsters ', function(err, results) {
for(i=0; i < results.length; i++){
Monsters[results[i].monster_id] = {
monster_id: results[i].monster_id,
monster_name: results[i].monster_name,
monster_filename: results[i].monster_filename,
monster_hp: results[i].monster_hp,
monster_chp: results[i].monster_hp,
monster_type: results[i].monster_type,
monster_level: results[i].monster_level,
xPosition: results[i].monster_xPosition,
yPosition: results[i].monster_yPosition
}
}
console.log(Monsters); // This Returns True with all the objects properties!
db.end();
});
console.log(Monsters); // This Returns Empty?
是否可以在 mysql 回调之外使用 Monsters 对象(或任何对象)?
最佳答案
简短回答:否。
长答案:欢迎使用 NodeJS 异步编程!您的错误不是由于范围问题,而是由于时间问题!您的异步代码不按源代码顺序运行。您的代码执行以下操作:
- 初始化全局变量
Monsters
引用一个空的Javascript对象 - 向
db.query
提交异步请求,并传递带有错误参数和结果的回调 - console.log
Monsters
的内容,它仍然引用空数组
NodeJS 到达其主循环的末尾并开始计时。在等待 db.query 完成其异步 IO 时,这种情况可能会发生多次。在未来的某个时候我们会恢复:
- db.query 解析并运行您的回调函数。
- 将
结果
中的所有元素克隆到全局变量Monsters
处的对象 怪物的日志值
您将需要重组代码以遵循异步回调结构,或者您可以研究类似 Promises 的替代方案。或coroutines .
请参阅How to return the response from an asynchronous call? ,它很好地解释了你的问题。
关于mysql - Nodejs MySql 全局变量限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28955626/