我试图从目录中的几个文件中显示一些数据,但是内容以错误的顺序打印出来。
fs.readdir('files/sets', function(err, files){
for(var i = 0; i < files.length; i++){
console.log("_______________________________");
readFile(files[i]);
}
});
function readFile(file){
csv()
.from.path('files/training_set/'+file, {delimiter: ','})
.transform(function(row){
console.log(row);
});
}
每个文件包含两行:
文件一:
John:
Hey there!
文件二:
Mary:
Whats up!
我希望输出类似于
____________________
John
Hey there!
____________________
Mary
Whats up!
但实际上我得到了
____________________
____________________
John
Mary
Hey there!
Whats up!
我一直在寻找并认为它与异步函数有关,而循环要快。但我似乎无法解决问题。我尝试了以下方法,但结果是一样的。
fs.readdir('files/sets', function(err, files){
for(var i = 0; i < files.length; i++){
(function(j){
console.log("_______________________________");
readFile(files[j]);
})(i)
}
});
答案 0 :(得分:1)
readFile
是异步操作,您尝试同步运行它而不等待回调完成:
var async = require('async'); // npm install async
fs.readdir('files/sets', function(err, files){
async.eachSeries(files,readFile,function(err){
// more async stuff ...
});
});
function readFile(file,callback){
console.log("_______________________________");
csv()
.from.path('files/training_set/'+file, {delimiter: ','})
.transform(function(row){
console.log(row);
}).on('close',function() {
callback();
});
}
此外,如果您需要等待上一个文件完成,则必须连续运行它。
答案 1 :(得分:0)
是的,您正在看到异步处理的结果。您不希望一次写一行,因为您通常会获得散布的文件的输出。相反,您只想在一次调用console.log时将文件的整个输出写入控制台。
我认为这应该有效:
fs.readdir('files/sets', function(err, files){
for (var i = 0; i < files.length; i++){
readFile(files[i]);
}
});
function readFile(file){
var outStr = "_______________________________";
csv()
.from.path('files/training_set/'+file, {delimiter: ','})
.transform(function(row){
outStr += '\n' + row;
})
.on('end', function(){
console.log(outStr);
});
}