返回值时未定义

我有节点项目。 根文件是index.js和文件helper.js ,在这里我有一些帮助函数,它被导入到index.js 。 我想获得一些数据,在helper.js使用函数,但是当我在index.js调用它时,它返回undefined 。 但在helper.js everething是好的, 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; }); } } 

你可以使用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方法是asynchronous的,不会给你任何数据检查这里的文档 。

所以有一个select就是像我一样使用Promise ,或者使用@Tatsuyuki Ishi的回答build议的callback ,你可以查看关于callback实现的文档。

问题是fs.readFile是一个asynchronous函数,所以不会返回任何东西。

如果你真的需要它返回的东西,你可以使用同步版本, fs.readFileSync

否则 – 更好的方法 – 将getData返回一个承诺 ,然后你可以用allDataresolve

readFile是一个asynchronous函数,它接受一个callback。 你有两个select:

1。 在getData()获取一个callback参数。

  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这样的依赖关系。

问题是,你从callback函数返回allData ,而不是getData函数。 而且由于getData没有明确的return ,所以你的helper.getData()函数将会返回undefined并且这个值会被打印出来而不是你想要的。

我build议使用Promise正确返回数据,就像在@ sand的答案中一样。