考虑到以下代码块,如何让loadConfig()返回JSON配置对象?
function loadConfig(){
fs.readFile('./config.json', 'utf8', function (err, data){
if (err) throw err;
var config = JSON.parse(data);
});
return config;
};
返回的配置未定义,因为变量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()返回config JSON对象?
答案 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
});
答案 1 :(得分:0)
简单的答案是你不能。
这些是异步调用,这意味着您的return语句不会等待您的响应,它将继续执行。因此,当您调用函数时,将首先触发return语句,然后您将收到响应。
相反,请为您的操作使用成功回调函数,而不是返回值..
答案 2 :(得分:0)
使用readFileSync
代替readFile
。由于readFile
是异步方法。
function loadConfig(){
var fileContent = fs.readFile('./config.json', 'utf8').toString();
return fileContent?JSON.parse(fileContent):null;
};
答案 3 :(得分:-2)
您也可以使用readFile的同步版本或是,Promise是另一种解决方案。 Doc在这里:https://nodejs.org/api/fs.html#fs_fs_readfilesync_file_options