所以我试图使用nodejs表达FS模块迭代我的应用程序中的目录,将每个文件名存储在一个数组中,我可以将其传递给我的快速视图并遍历列表,但我很难这样做.当我在files.forEach函数循环中执行console.log时,它打印文件名就好了,但是一旦我尝试做任何事情,例如:
var myfiles = [];
var fs = require('fs');
fs.readdir('./myfiles/', function (err, files) { if (err) throw err;
files.forEach( function (file) {
myfiles.push(file);
});
});
console.log(myfiles);
Run Code Online (Sandbox Code Playgroud)
它失败了,只记录一个空对象.所以我不确定究竟发生了什么,我认为它与回调函数有关,但是如果有人能够告诉我我做错了什么,以及为什么它不工作,(以及如何使其工作),它将是非常感激.
Rob*_*sch 31
myfiles数组为空,因为在调用console.log()之前尚未调用回调.
你需要做的事情如下:
var fs = require('fs');
fs.readdir('./myfiles/',function(err,files){
if(err) throw err;
files.forEach(function(file){
// do something with each file HERE!
});
});
// because trying to do something with files here won't work because
// the callback hasn't fired yet.
Run Code Online (Sandbox Code Playgroud)
请记住,节点中的所有内容同时发生,在某种意义上,除非您在回调中进行处理,否则您无法保证异步功能已经完成.
解决这个问题的一种方法是使用EventEmitter:
var fs=require('fs'),
EventEmitter=require('events').EventEmitter,
filesEE=new EventEmitter(),
myfiles=[];
// this event will be called when all files have been added to myfiles
filesEE.on('files_ready',function(){
console.dir(myfiles);
});
// read all files from current directory
fs.readdir('.',function(err,files){
if(err) throw err;
files.forEach(function(file){
myfiles.push(file);
});
filesEE.emit('files_ready'); // trigger files_ready event
});
Run Code Online (Sandbox Code Playgroud)
fs.readdir是异步的(与node.js中的许多操作一样).这意味着该console.log行将在readdir有机会调用传递给它的函数之前运行.
你需要:
将该console.log行放在给定的回调函数中readdir,即:
fs.readdir('./myfiles/', function (err, files) { if (err) throw err;
files.forEach( function (file) {
myfiles.push(file);
});
console.log(myfiles);
});
Run Code Online (Sandbox Code Playgroud)
或者只是对内部的每个文件执行一些操作forEach.
正如一些人提到的,您使用的是异步方法,因此您有一个不确定的执行路径。
但是,有一个简单的方法可以解决这个问题。只需使用该方法的同步版本:
var myfiles = [];
var fs = require('fs');
var arrayOfFiles = fs.readdirSync('./myfiles/');
//Yes, the following is not super-smart, but you might want to process the files. This is how:
arrayOfFiles.forEach( function (file) {
myfiles.push(file);
});
console.log(myfiles);
Run Code Online (Sandbox Code Playgroud)
这应该可以正常工作。但是,使用同步语句并不好,因此除非同步非常重要,否则您不应该这样做。
在此处阅读更多信息:fs.readdirSync