我是节点项目。
根文件是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;
});
}
}
答案 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的答案。