2017-03-17 178 views
0

考虑到以下代码块,如何让loadConfig()返回JSON配置对象?Javascript嵌套函数返回

function loadConfig(){ 
    fs.readFile('./config.json', 'utf8', function (err, data){ 
    if (err) throw err; 
    var config = JSON.parse(data); 
    }); 
    return config; 
}; 

返回的配置是不确定的变量配置是loadConfig()函数的范围之内,但如果return语句位于READFILE匿名函数里面,它不通过对loadConfig下降( ),看起来只会打破嵌套的匿名函数。

另一个尝试通过将匿名函数保存在主函数loadConfig返回的变量中来解决此问题,但无济于事。

function loadConfig(){ 
    var config = fs.readFile('./config.json', 'utf8', function (err, data){ 
    if (err) throw err; 
    var config = JSON.parse(data); 
    return config; 
    }); 
    return config; 
}; 

问题立场;在上面给出的情况下,如何使loadConfig()返回配置JSON对象?

+0

'readFile'是异步的 - 所以你永远不能从该函数中'返回'。 – tymeJV

+0

阅读关于承诺 – Roljhon

+0

承诺是你的朋友! –

回答

2

只要定义/使用一个承诺:

function loadConfig(){ 
    return new Promise(function(resolve, reject) { 
    fs.readFile('./config.json', 'utf8', function (err, data){ 
     if (err) reject(err); 

     var config = JSON.parse(data); 
     resolve(config); 
    }); 
    }) 
}; 

,并使用它:

loadConfig().then(function(config) { 
    // do something with the config 
}).catch(function(err){ 
    // do something with the error 
}); 
+0

这是最好的方式来做到这一点,或使用成功 – user7417866

+0

所以我不能只有一个全局变量与配置对象,我可以随时参考;我需要使用configVar.then(...);访问配置对象我把它作为我不能只是将输入返回到“然后功能”。我在这里纠正? –

+0

你可以有一个全局变量,但是因为这个动作是异步的,所以你不知道该变量何时被填充。通过使用'then'可以避免这种情况,因为只要配置完成,就可以在下一个函数中使用它。这被称为承诺或未来(用其他语言),并且是处理异步操作的惯用方式。你基本上返回一个函数,你可以在它有一些结果后立即使用它。请在这里阅读更多https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise – caisah

0

简单的答案是你不能。

这些是异步调用,这意味着你的return语句不会等待你的响应,它会继续执行。因此,当您调用函数时,您的返回语句会先被触发,然后您会收到响应。

相反,使用成功的回调函数为您的操作,并没有返回值..

0

使用readFileSync,而不是readFile。由于readFile是异步方法。

function loadConfig(){ 
    var fileContent = fs.readFile('./config.json', 'utf8').toString(); 
    return fileContent?JSON.parse(fileContent):null; 
};