将json数据读入Node.js中的全局变量

时间:2012-07-07 14:15:18

标签: file node.js readfile

我正在尝试将json结构读入全局变量,但似乎无法使其工作。一旦从文件中读取(该部分正在工作),我正在使用回调进行处理。

我想填充“source_files”。

var fs = require('fs');
var source_files = [];

function readConfig(callback) { 
    fs.readFile('data.json', 'utf-8', function (err, content) {
        if (err) return callback(err);
        callback(content);
    });             
}                       

readConfig(function(config) { 
    var settings = JSON.parse(config);
    var inputs = settings.inputs;

    for (var id=0; id < inputs.length; id++) {
        source_files.push(inputs[id].replace('./',''));
    }           
});

console.log(source_files);

2 个答案:

答案 0 :(得分:5)

请记住readFile is asynchronous。您的最后一行console.log(source_files)将在调用readFile回调之前运行,因此在调用readConfig回调之前。您需要将移动到 readConfig回调中。

使用您的代码,这是发生的事情:

  1. 创建空白数组。
  2. 它会调用readConfig
  3. readConfig来电readFile
  4. readFile 启动异步读取操作并返回。
  5. readConfig返回。
  6. 您记录source_files,这是空的。
  7. 稍后,readFile操作完成并调用回调。它调用readConfig回调。
  8. readConfig回调填充source_files,但它有点像落在森林中的树,因为没有观察到。 : - )

答案 1 :(得分:2)

如前所述,readFile是异步的。如果这只是启动初始化代码(即,如果它阻止则无关紧要),您可以改为使用readFileSync(抛出err或返回content)。

但是,如果还可以调用readConfig以响应稍后的输入(例如POSIX信号或TCP请求),那么您必须保持其异步或冒险阻止其他I / O.