为什么新的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的日志值


您将需要重组代码以遵循异步回调结构,或者可以调查诸如Promisescoroutines之类的替代方案。

请参阅How to return the response from an asynchronous call?,其中包含有关您的问题的详细说明。

关于mysql - Nodejs MySql全局变量限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28955626/

10-13 06:59