1

我正在尝试将 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);
4

2 回答 2

5

记住那readFile异步的。您的最后一行 ,console.log(source_files)将在回调被调用之前运行,因此readFilereadConfig回调被调用之前。您需要将其移至回调readConfig

使用您的代码原样,会发生以下情况:

  1. 它创建空白数组。
  2. 它调用readConfig.
  3. readConfig来电readFile
  4. readFile 启动异步读取操作并返回。
  5. readConfig返回。
  6. 你登录source_files,它是空的。
  7. 稍后,readFile操作完成并调用回调。它调用readConfig回调。
  8. readConfig回调填充了 ,但它有点像此时source_files一棵树倒在森林里,因为没有观察到这一点。:-)
于 2012-07-07T14:18:37.217 回答
2

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

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

于 2012-07-07T15:51:38.707 回答