gpt4 book ai didi

javascript - 异步读取文件

转载 作者:行者123 更新时间:2023-11-30 11:56:15 24 4
gpt4 key购买 nike

我正在尝试读取一些文件并将它们的名称存储在 nodejs 的数组中。我做了一个函数。它读取文件,并在控制台中打印出来,但数组的输出是 []。我假设这是因为 node.js 是异步的,但我认为回调可以解决它?

readCurdir("./uploads/", curDirReadFinn); 
function readCurdir(dir, callback){
var tmpArray = [];
fs.readdir(dir, function(err, files){
if(err){
if(err.code==='EISDIR'){}
else{
console.log(err);
}
return;
}
files.forEach(function(file){
fs.readFile(dir + file, 'utf-8', function(err, data){
if(err){
if(err.code==='EISDIR'){}
else{
console.log(err);
}
return;
}
tmpArray.push(file);
console.log(file); //this prints
});
});
});
callback(tmpArray);
}
function curDirReadFinn(array){
console.log(array); //Output: []
}

我也试过这个:

files.forEach(function(file){
fs.readFile(dir + file, 'utf-8', function(err, data){
if(err){
if(err.code==='EISDIR'){}
else{
console.log(err);
}
return;
}
tmpArray.push(file);
counter++;
if(counter === files.lenght){
callback(tmpArray);
}
});
});

最佳答案

第二次尝试时您的想法是正确的。在我简化它之后,它就完美地工作了:

function readCurdir(dir, callback){
var tmpArray = [];

fs.readdir(dir, function(err, files) {
if (err) {
return console.log(err);
}

var counter = files.length;

files.forEach(function(file) {
fs.stat(path.join(dir, file), function(err, stats) {
if (err) {
console.log(err);
}
else if (stats.isFile()) {
tmpArray.push(file);
}

--counter === 0 && callback(tmpArray);
});
});
});
}

您可以使用 async 进一步简化它(并更容易传播错误)模块:

async.each(files, function(file, cb) {
fs.stat(path.join(dir, file), function(err, stats) {
if (err) {
return cb(err);
}
else if (stats.isFile()) {
tmpArray.push(file);
}

cb();
});
}, function(err) {
callback(err, tmpArray)
});

关于javascript - 异步读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37874827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com