Node.js以错误的顺序循环打印

我试图从目录中的几个文件中显示一些数据,但是其中的内容以错误的顺序打印出来。

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! 

我一直在寻找和思考它与asynchronous函数和循环是快速的。 但我似乎无法解决这个问题。 我已经尝试了下面的方法,但结果是一样的。

 fs.readdir('files/sets', function(err, files){ for(var i = 0; i < files.length; i++){ (function(j){ console.log("_______________________________"); readFile(files[j]); })(i) } }); 

readFile是一个asynchronous操作,你正试图同步运行它,而不用等待callback完成:

 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(); }); } 

另外,如果您需要等待上一个文件完成,则必须按顺序运行它。

是的,你正在看到asynchronous处理的结果。 你不想一次写一行,因为你通常会得到穿插文件的输出。 相反,您只需要将一个文件的全部输出写入控制台,只需一次调用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); }); }