修改和传递全局变量

时间:2015-01-05 19:28:50

标签: javascript node.js

我在回调中修改全局变量时遇到了问题。

我需要每小时从文件重新加载数据。如果我使用readFileSync,它可以正常工作,但如果我使用普通readFile

则不行
var MY_GLOBAL = {};

fs.readFile("some_path", function (err, data) {
    if (err) throw err;
    MY_GLOBAL.some_name = data;
    });

setInterval(function() {
    fs.readFile("some_path", function (err, data) {
        if (err) throw err;
        MY_GLOBAL.some_name = data;
        }
    }, 60 * 60 * 60 * 1000);

我有另一个名为router.js的模块,其中包含我的应用程序的所有路由。

我用它来称呼router(app, MY_GLOBAL)

我的问题是虽然在MY_GLOBAL回调中设置了readFile,但它在路由器中没有更新。我需要每小时访问更新的数据。

2 个答案:

答案 0 :(得分:0)

我可以建议几件事情来检查。

首先,我会使用console.logalert仔细检查回调函数是否正在执行。

我还想指出,对象是通过Javascript中的引用传递的,这意味着传递给router的对象是对MY_GLOBAL的引用,而不是MY_GLOBAL的副本}。这可能出错的地方是你在哪里重新分配了MY_GLOBAL。我会确保你没有在任何地方重新分配MY_GLOBAL。

此外,如果data是一个对象(而不是字符串,数字或布尔值),则需要检查它是否也没有被重新分配。例如,如果您在router内读取MY_GLOBAL.some_name的值,则可能在data分配给MY_GLOBAL.some_name后保留对旧版本的引用。

答案 1 :(得分:0)

如果是全局声明,为什么不尝试使用module关键字,很多人会使用window

另一件事。您希望每小时执行一次功能代码。你在第二个参数中增加了一个60倍。试试这个。

module.MY_GLOBAL = {};

var callbackFunction = function(){
  fs.readFile("some_path", function (err, data) {
    if (err) throw err;
    module.MY_GLOBAL.some_name = data;
  }
};
callbackFunction();
setInterval(callbackFunction , 60 * 60 * 1000); // 360000 == 1 hour