mysql - Nodejs MySql 全局变量限制

标签 mysql node.js

为什么新的 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/

    相关文章:

    Javascript/我的动态函数安全吗?

    javascript - 将 seriate Node.js 与 Web 应用程序连接的最佳方法是什么

    node.js - nginx 和 nodejs 提供动态文件夹中的图像

    mysql - MySQL Query IF ELSEIF ELSE 的写法

    php - 为什么我的 PDO 总是出现 bool 错误?

    MySQL:无法以 Upper Camel Case (Pascal Case) 给表命名

    mysql - 如何从 SQL 查询中获取多列并将它们存储在 perl 的二维数组中

    php - 检查空白字段还是插入所有内容?

    javascript - 如何将 Angular 和 Nodejs 安装在同一文件夹中

    javascript - 无法在 Express 生成器上执行 npm start