2011-09-22 103 views
2

我正在學習NodeJS的事件模型。當我讀/寫同一個文件時會發生什麼?

我對輸出感到困惑。

該代碼只是將一些文本寫入文件並將其讀回來。 執行順序似乎超出了我的控制範圍。

var fs = require('fs'); 
var ws = fs.createWriteStream("my_file.txt"); 
ws.once('open', function(fd) { 
    console.log('ws_open'); 
    ws.write("My first row\n"); 
    ws.write("My second row\n"); 
    ws.write("My third row\n"); 
    ws.destroySoon(); 
}); 

ws.once('close', function() { 
    console.log('ws_close'); 
}); 

var rs = fs.createReadStream("my_file.txt"); 
rs.setEncoding('utf8'); 
rs.once('open', function(fd) { 
    console.log('rs_open'); 
}); 
rs.once('close', function() { 
    console.log('rs_close'); 
}); 

rs.once('data', function(data) { 
    console.log('rs_data'); 
    console.log(data); 
}); 

rs.once('error', function(exception) { 
    console.log('rs_exception'); 
    console.log(exception); 
}); 

這裏是輸出。

rs_open
ws_open
rs_close
ws_close

有時,它成爲

ws_open
rs_open
rs_data
我的第一行

rs_close
ws_close

誰能給我解釋一下?

提前致謝。

回答

2

你正在做異步的東西,就好像它是同步的。只是因爲代碼中的某些東西並不代表它會在稍後發生。如果您不想在寫完文件之前閱讀文件,請將您的閱讀放入寫入的回調中。

爲:(簡化)

writeFile (name, writeData, function (error) { 
    if (error) 
    .... // handle error 
    else { // successfully wrote file 
    readFile(name, function (error, readData) { 
    if (error) 
     .... // handle error 
    else { // successfully read file 
     ... // do something with readData 
    } 
    }); 
    } 
}); 
+0

謝謝。這可以解決問題。 –

+1

我在考慮文件鎖定問題。 (思考多線程編程模型) 在某些情況下,模塊可能會同時讀取/寫入同一個文件。在其他語言中,我通常鎖定文件直到完成。 但是,在NodeJS中,我如何以異步/非阻塞的方式思考? –

相關問題