2012-07-07 35 views
1

我試圖將json結構讀入全局變量,但似乎無法使其工作。一旦從文件讀取(該部分正在工作),我正在使用回調進行處理。在Node.js中將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); 

回答

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,但它有點像一棵樹在那裏落在森林裏,因爲沒有什麼可以觀察到的。 :-)
+0

謝謝我不知道readFileSync。 – 2012-07-07 16:40:46

2

如前所述,readFile是異步的。如果這只是啓動初始化代碼(即,如果它阻塞無關緊要),則可以使用readFileSync代替(它會引發err或返回content)。但是,如果readConfig也可以響應後來的輸入(例如POSIX信號或TCP請求)而被調用,那麼你必須保持異步或阻止其他I/O。

+0

是readFileSync是我需要的!謝謝! – 2012-07-07 16:41:14