Javascript 返回值时未定义
我有一个新项目。 根文件是Javascript 返回值时未定义,javascript,node.js,Javascript,Node.js,我有一个新项目。 根文件是index.js和文件helper.js,这里我有一些helper函数,它被导入到index.js。 我试图使用helper.js中的函数获取一些数据,但是当我在index.js中调用它时,它返回undefined。 但是在helper.js中,一切正常,console.log显示我需要的数据。 我怎样才能解决这个问题 index.js文件内容: const helper = require('./helper'); let data = helper.getData
index.js
和文件helper.js
,这里我有一些helper函数,它被导入到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
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;
});
}
}
helper.js文件内容:
const helper = require('./helper');
let data = helper.getData();
console.log(data); // undefined
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;
});
}
}
您可以使用:
然后:
helper.getData().then(function(data){
console.log(data);
}, function(err){
// here something failed
});
问题是,fs.readFile
方法是异步的,不会给您任何结果数据
因此,一种选择是像我所做的那样使用回调函数,或者像@Tatsuyuki Ishi的回答中建议的那样使用回调函数。你可以使用:
然后:
helper.getData().then(function(data){
console.log(data);
}, function(err){
// here something failed
});
问题是,fs.readFile
方法是异步的,不会给您任何结果数据
因此,一种选择是像我所做的那样使用回调函数,或者像@Tatsuyuki Ishi的回答中所建议的那样使用回调函数。问题是,fs.readFile
是一个异步函数,因此不返回任何内容
如果您真的需要它返回一些东西,您可以使用同步版本
否则,一个更好的方法是让getData
返回一个函数,然后使用allData
解析。问题是fs.readFile
是一个异步函数,因此不返回任何内容
getData: (callback) => {
fs.readFile('data.json', 'utf8', (err, data) => {
const allData = JSON.parse(data);
console.log(allData); // IS OK!
callback(allData);
});
}
如果您真的需要它返回一些东西,您可以使用同步版本
否则,一个更好的方法是让getData
返回一个函数,然后使用allData
解析,readFile
是一个异步函数,它接受回调。您有两个选择:
getData: (callback) => {
fs.readFile('data.json', 'utf8', (err, data) => {
const allData = JSON.parse(data);
console.log(allData); // IS OK!
callback(allData);
});
}
一,。在getData()
中获取回调作为参数
二,。使用同步版本
getData: () => {
var data = fs.readFileSync('data.json', 'utf8');
const allData = JSON.parse(data);
console.log(allData); // IS OK!
return allData;
}
当然,您可以使用Promise,它在链接事物时更漂亮,但它通常与依赖项一起使用,例如。readFile
是一个异步函数,它接受回调。您有两个选择:
一,。在getData()
中获取回调作为参数
二,。使用同步版本
getData: () => {
var data = fs.readFileSync('data.json', 'utf8');
const allData = JSON.parse(data);
console.log(allData); // IS OK!
return allData;
}
当然,您可以使用Promise,它在链接事物时更漂亮,但它通常与依赖项一起使用,例如。问题是,您是从回调函数返回所有数据,而不是从getData
函数返回。由于getData
没有显式的return
,因此您的helper.getData()
函数将返回undefined
,并且将打印此值而不是您想要的值
我建议使用Promise正确地返回数据,如@sand的回答所示。问题是,您是从回调函数返回allData
,而不是getData
函数。由于getData
没有显式的return
,因此您的helper.getData()
函数将返回undefined
,并且将打印此值而不是您想要的值
我建议使用Promise正确返回数据,如@sand的回答所示。欢迎来到异步函数的精彩世界本主题使用promise获取异步函数的精彩世界欢迎来到异步函数的精彩世界本主题使用promise获取异步函数的精彩世界我在您的回答后删除了我的评论,懒得写承诺;)我不想打扰任何人,但我认为这是一个非常糟糕的答案,因为它只提出了一个解决方案,但没有用一个词解释根本的问题是什么。而且,所展示的解决方案只是一个任意的解决方案,它来自于一堆更多的解决方案——我为什么要使用承诺呢?我也可以回电话,例如:完美我在你回答后删除了我的评论,懒得写承诺;)我不想打扰任何人,但我认为这是一个非常糟糕的答案,因为它只提出了一个解决方案,但没有用一个词解释根本的问题是什么。而且,所展示的解决方案只是一个任意的解决方案,它来自于一堆更多的解决方案——我为什么要使用承诺呢?我也可以回电话,例如。