2012-03-27 30 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