我具有以下功能:
readFiles: function(partidosPath) {
fs.readdir(partidosPath,function(err,files){
if (err) throw err;
files.forEach(function(file){
if(file) {
fs.readFile(partidosPath+file, 'utf8', function (err,data) {
var details = [];
if (err) {
return console.log(err);
}
commonFunctions.arrayLoader(details, {name: file, content: data});
console.log(details);
return details;
});
}
});
});
}
从目录中的文件列表中读取内容。
我需要使用每个文件的名称和内容来保存对象数组,如下所示:
array = [{name: file1Name, content: file1Content},....]
我在另一个文件中调用该函数,如下所示:
var details = partidos.readFiles(partidosPath);
console.log(details);
问题在于,在console.log(details)
方法的readFiles
中,我可以正确看到信息,但是当我调用该方法时,console.log
返回未定义。
PD:如果我在声明的地方声明了details[]
的{{1}},则信息没有正确地推送到数组中。
我缺少什么?
答案 0 :(得分:0)
问题是您正在进行异步调用。在异步调用中,您的程序将在调用后继续运行,而无需等待函数完成,因此它们可以继续运行
console.log(details).
您要么做出承诺,然后让其等待呼叫完成,要么使用此处的呼叫同步版本。使用下面的链接
fs.readdirSync(path[, options])
fs.readFileSync(path[, options])
https://nodejs.org/api/fs.html#fs_fs_readdirsync_path_options
答案 1 :(得分:0)
您已经在'partidos.readFiles(partidosPath)'中包含了'console.log'语句。数据读取完成后,它将自动记录数据。您不需要其他console.log即可。
这是工作代码:
// utils.js
const fs = require('fs')
const readFiles = function (path, callback) {
let arrayOfFileObjects = [];
fs.readdir(path, function (err, fileNames) {
if (err) {
console.log('Read dir error!')
return;
}
if (fileNames.length <= 0) {
console.log('No files exist in the mentioned directory!')
return
}
for (let i = 0; i < fileNames.length; i++) {
const fileName = fileNames[i];
fs.readFile(`${__dirname}\\${fileName}`, 'utf-8', function (err, fileContent) {
if (err) {
console.log(err)
console.log('Error occured while attempting to read: ' + fileName)
return;
}
arrayOfFileObjects.push({
name: fileName,
content: fileContent
})
if (i === fileNames.length - 1) {
callback(arrayOfFileObjects);
}
})
}
})
}
module.exports = {
readFiles
}
// test.js
const utils = require('./utils')
utils.readFiles(__dirname, function(fileObjects) {
console.log(fileObjects)
})