返回值时未定义
我有节点项目。 根文件是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
返回一个承诺 ,然后你可以用allData
来resolve
。
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的答案中一样。