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

时间:2014-03-27 22:26:32

标签: javascript 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!

我一直在寻找并认为它与异步函数有关,而循环要快。但我似乎无法解决问题。我尝试了以下方法,但结果是一样的。

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

2 个答案:

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