我要列出/home/myComputer/Desktop/Research
中所有目录中的所有文件,然后使用if语句过滤它们,以仅获取我想读取并存储到数组中的.txt文件。一切正常,但是将数据推入数组无法正常工作。当我用控制台登录它们时,它们不返回任何值[]
。
我尝试了promise和回调函数,但是它们对我没有用,因为我不知道如何正确实现它们。
app.get('/jsonData', function(req, res) {
/* Define Arrays */
var theFile = [];
var theCategory = [];
var theContent = [];
var walk = function(dir, done) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err) return done(err);
var i = 0;
(function next() {
var file = list[i++];
if (!file) return done(null, results);
file = dir + '/' + file;
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
results = results.concat(res);
next();
});
} else {
results.push(file);
next();
}
});
})();
});
};
//walk(process.env.HOME, function(err, results) {
walk("/home/myComputer/Desktop/Research", function(err, results) {
if (err) throw err;
//console.log(results);
results.map(function(val) {
//Get the filename
var fileName = val.match(/[^\/]+$/).join();
//Get the category
var category = val.substr(48).match(/[^\/]+/);
if (fileName == 'written-speech.txt') {
console.log('FOUND!: ' + fileName + ' Category: ' + category) //this works
fs.readFile(val, 'utf8', function(err, contents) {
console.log(contents); // this works
theFile.push(fileName);
theCategory.push(category);
theContent.push(contents);
});
}
})
});
console.log(theFile); // The problem: This returns an empty Array []
console.log(theCategory); // The problem: This returns an empty Array []
console.log(theContent); // The problem: This returns an empty Array []
});
我希望console.log(theFile);
console.log(theCategory);
和console.log(theContent);
返回推入其中的数据。
答案 0 :(得分:1)
其原因是Javascript中的许多回调都是异步的,这意味着fs.readdir
和fs.readFile
都是异步的,它们的回调不会立即调用,而是稍后调用(请阅读javascript中的事件循环) )。因此,目前,当您记录阵列时,它们为空,稍后将向其中推送数据。在未来。为避免这种情况,您可以使用同步方法(fs.readdirSync和fs.readFileSync),该方法很丑陋,如果应用程序有很多其他异步操作,则可能导致性能问题。如果您的情况只是读取某些数据的简单脚本,那可能很好。
另一种首选方式是使用Promise或某个库来管理回调,例如async
。如果您完全不熟悉这些概念,请阅读一些有关管理异步代码的文章。 https://dev.to/mrm8488/from-callbacks-to-fspromises-to-handle-the-file-system-in-nodejs-56p2以获得基本的了解并查看一些用例示例。
关于您当前的版本,没有很多更改就没有简单的方法来使其运行。最好使用我之前描述的概念对其进行重写。
答案 1 :(得分:1)
walk是一个异步函数,因为fs.readdir
是一个异步方法,并且在调用fs.readdir的回调之前,console.log语句正在运行(以同步方式)。
您可以在walk回调的结尾处控制台这些变量的值。