gpt4 book ai didi

mysql - Nodejs MySql 全局变量限制

转载 作者:行者123 更新时间:2023-11-29 12:21:22 25 4
gpt4 key购买 nike

为什么新的 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 异步编程!您的错误不是由于范围问题,而是由于时间问题!您的异步代码不按源代码顺序运行。您的代码执行以下操作:

  1. 初始化全局变量Monsters引用一个空的Javascript对象
  2. db.query 提交异步请求,并传递带有错误参数和结果的回调
  3. 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com