2012-03-27 60 views
0

我想写一个简单的NodeJS应用程序,读取一个文件,逐行分析它的行并写出结果。这里是工作脚本不执行代码行 - 为什么?

var lines; 
var fs = require('fs'); 
var data=""; 
fs.readFile('list.csv', 'ascii', function(err,data){ 
    if(err) { 
     console.error("Could not open file: %s", err); 
     process.exit(1); 
    } 
    var data2=data.split(/[\n\r]+/); 
    for(var i=0; i<data2.length; i++){ 
     /*LISTING ALL THE LIST LINE-BY-LINE */ 
     console.log(i + data2[i]); 
    } 
}); 

我想知道为什么我应该写内部function(err,data){..*my-code*..}我的代码的代码示例?我试图将所有变量声明为全局变量并写入

console.log(); 

在代码的末尾 - 它似乎只是不执行此代码行。那么,为什么我不能在function(err,data){}之外写我的代码呢?

+1

伊利亚,看这个答案:http://stackoverflow.com/questions/9362823/why-is-a-function-and-a-callback-non-blocking-in-node-js/9363071#9363071 – 2012-03-27 08:48:10

回答

1

NodeJS的一个主要特性是非阻塞事件循环。当函数花费很长时间时,Node脚本不会等待函数返回,这就是为什么您需要在回调中传入代码的原因。

+0

所以,如果我想编写一个非阻塞脚本,我应该在回调函数中处理回调代码。 – f1nn 2012-03-27 09:20:09

+0

是的,就像在你发布的演示中一样。如果你不这样做,不能保证你的代码是否会在'readFile'函数之前或之后运行 - 所以你可能会或可能不会获得数据。 – 2012-03-27 11:14:23

0

默认情况下所有的文件系统操作是非阻塞的,所以结果需要在操作完成后运行一个回调函数来使用,在这种情况下,当文件完成读入变量时。

虽然这通常是一个更好的设计使用非阻塞IO,以使服务器能够同时运行多个操作,你可以切换大部分fs操作的同步运行:

var data = fs.readFileSync('list.csv', 'ascii'); 
+0

这很好,谢谢。虽然,我没有发现这段代码比我以前列出的异步代码慢一点。 – f1nn 2012-03-27 09:21:01