为什么新的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
提交异步请求,并传递带有参数err和结果的回调
console.log Monsters
的内容,该内容仍引用一个空数组
NodeJS到达其主循环的末端并滴答作响。等待db.query完成其异步IO时,可能会发生多次。在将来的某个时候,我们将恢复:
db.query解析并运行您的回调函数。
将results
中的所有元素克隆到全局变量Monsters
中的对象中Monsters
的日志值
您将需要重组代码以遵循异步回调结构,或者可以调查诸如Promises或coroutines之类的替代方案。
请参阅How to return the response from an asynchronous call?,其中包含有关您的问题的详细说明。
关于mysql - Nodejs MySql全局变量限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28955626/