返回值时未定义

时间:2017-04-20 10:42:45

标签: javascript node.js

我是节点项目。 根文件是index.js和文件helper.js,这里我有一些帮助函数,它导入index.js。 我正在尝试使用helper.js中的函数获取一些数据,但是当我在index.js中调用它时,它返回undefined。 但在helper.js中,一切正常,console.log显示我需要的数据。 我该如何解决这个问题?

index.js文件内容:

const helper = require('./helper');

let data = helper.getData();
console.log(data); // undefined

helper.js文件内容:

const fs = require('fs');

module.exports = {
  getData: () => {
    fs.readFile('data.json', 'utf8', (err, data) => {
      const allData = JSON.parse(data);
      console.log(allData); // IS OK!
      return allData;
    });
  }
}

4 个答案:

答案 0 :(得分:5)

您可以使用Promise

const fs = require('fs');

module.exports = {
  getData: () => {
    return new Promise(function(resolve, reject){
        fs.readFile('data.json', 'utf8', (err, data) => {
            if(err){ 
                reject(err);
            } else {
                try {
                    resolve(JSON.parse(data));
                } catch(ex){
                    reject(ex);
                }
            }
        });  
    });
  }
}

然后:

helper.getData().then(function(data){
    console.log(data);
}, function(err){
    // here something failed
});

问题是fs.readFile方法是异步的,不会将任何数据check the documentation here作为结果提供给您。

所以一个选项就是像我一样使用Promise或使用@Tatsuyuki Ishi答案中建议的callback,您可以查看有关callback实施的文档。

答案 1 :(得分:2)

问题是fs.readFile是一个异步函数,因此不会返回任何内容。

如果你真的需要它来返回一些内容,你可以使用同步版本fs.readFileSync

否则 - 以及更好的方法 - 让getData返回promise,然后resolve allData返回 public List<ExcelPackage> ExcelPackagesFromCsvStream(Stream csvStream, int batchSize) { var excelPackages = new List<ExcelPackage>(); int currentPackage = -1; // so that first package will have the index 0 var csvFormat = new ExcelTextFormat { Delimiter = ',', TextQualifier = '"', DataTypes = new[] {eDataTypes.String} }; using (var sr = new StreamReader(csvStream)) { int index = 1; foreach (var line in sr.ReadLines("\r\n")) { if ((index - 1) % batchSize == 0) { var excelPackage = new ExcelPackage(); excelPackage.Workbook.Worksheets.Add("Sheet1"); excelPackages.Add(excelPackage); currentPackage++; index = 1; } excelPackages[currentPackage].Workbook.Worksheets.First().Cells["A" + index].LoadFromText(line, csvFormat); index++; } } return excelPackages; }

答案 2 :(得分:1)

readFile是一个异步函数,它接受回调。您有两种选择:

1。获取getData()中的参数回调。

  getData: (callback) => {
    fs.readFile('data.json', 'utf8', (err, data) => {
      const allData = JSON.parse(data);
      console.log(allData); // IS OK!
      callback(allData);
    });
  }

2。使用同步版本。

  getData: () => {
    var data = fs.readFileSync('data.json', 'utf8');
    const allData = JSON.parse(data);
    console.log(allData); // IS OK!
    return allData;        
  }

当然,你可以使用Promise,它在链接的东西上更漂亮,但它经常用于像Bluebird这样的依赖项。

答案 3 :(得分:1)

问题是,您从回调函数返回allData,而不是getData函数。由于getData没有明确return,因此您的helper.getData()函数将返回undefined,并且会打印此值而不是您想要的值。

我建议使用Promise正确返回数据,如@ sand的答案。