为什么新的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对象(或任何)?
答案 0 :(得分:1)
简短回答:不。
答案很长:欢迎使用NodeJS中的异步编程!您的错误不是由于范围问题,而是时间问题!您的异步代码不按源顺序运行。您的代码执行此操作:
Monsters
引用空的Javascript对象db.query
提交异步请求,并使用params err和结果传递回调Monsters
的内容,仍然引用空数组NodeJS到达它的主循环结束并打勾。在等待db.query完成其异步IO时,这可能会发生很多次。在未来的某个时刻,我们将恢复:
results
中的所有元素克隆到全局变量Monsters
Monsters
您需要重新构建代码以遵循异步回调结构,或者您可以调查Promises或coroutines等替代方案。
请参阅How to return the response from an asynchronous call?,它解释了您的问题。