2015-12-06 250 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);