Javascript嵌套函数返回

时间:2017-03-17 18:18:18

标签: javascript

考虑到以下代码块,如何让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对象?

4 个答案:

答案 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