2015-12-06 63 views
0

我有一個對象的構造函數。由於它創建的參數是固定的,我將它們作爲數組存儲在JSON文件中,並希望我可以使構造函數從該文件中獲取參數。從構造函數中獲取JSON的構造函數參數?

即使讀JSON文件速度快,I D不喜歡,並認爲我能做到這一點:

//test.json: 
[ 
    {"foo": "L", "bar": 120000}, 
    {"foo": "T", "bar": 1000}, 
    {"foo": "D", "bar": 1000} 
] 

所以現在,在我的目標,我只是解析JSON和從它創建的對象,我已經想這將是簡單的:

//test.js 
var fs = require('fs'), 
    tests = []; 

function Test(id) { 
    this.foo = tests[id].foo; 
    this.bar = tests[id].bar; 
} 

function print() { 
    console.log(this); 
} 

module.exports = Test; 
Test.prototype.print = print; 

fs.readFile('./tests.json', function (err, data) { 
    if (err) { 
     console.log('Error reading tests.json\n' + err); 
     throw err; 
     return ; 
    } 
    tests = JSON.parse(data); 
}); 

但是當我嘗試使用它:

var Test = require('./test.js'), 
    t = new Test(0); 

t.print(); 

ñ Ode在teststest.js上拋出一個未定義的錯誤。

我可以看到該解決方案都impratical:

  • 解析JSON在構造函數中。它會阻止事件循環或使構造器異步,這兩種方法都很糟糕。
  • 從外部解析JSON,並創建一個簡單的類構造函數。因爲該對象在多個模塊一起使用,其中一些人是自己的對象,這將是impratical,這樣就需要獲得JSON作爲參數...

我缺少什麼?這種模式是否可能,或者我應該重新開始並找到另一種解決方案?

+1

你的問題不是關於構造函數,它只是'測試「是異步創建的。做一個'readFileSync'。 – Bergi

+0

@Bergi:我不相信我沒有看到......我會接受ShanShan的答案,因爲它也是對的,並且也學到了一些東西,但是會使用你的解決方案,因爲我仍然可以用try/catch來進行錯誤檢查。 – DrakaSAN

+1

'require()'也會拋出錯誤(未找到,語法錯誤...):) – Shanoor

回答

1

它會拋出undefined error,因爲fs.readFile()是異步的,所以tests在您嘗試讀取時尚未初始化。

你並不需要手動讀取您的JSON文件,並解析它,你可以要求它,你就會得到微小物體:

var tests = require('./tests.json'); // << make sure the path is ok 
console.log(tests);