Node.js循环打印顺序错误

Node.js loop printing in wrong order

本文关键字:顺序 错误 打印 循环 js Node      更新时间:2023-09-26

我试图显示一些数据从一对夫妇的文件在一个目录中,但是有内容打印出错误的顺序。

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

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

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

是的,您正在看到异步处理的结果。您不希望一次只写一行,因为您通常会得到分散的文件的输出。相反,您只希望在对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);
    });
}