我正在學習nodejs。我很難理解異步函數的工作原理。我的問題與下面的代碼有關。我試圖按以下完全相同的順序執行以下操作:瞭解node.js中的異步函數
- 打開文件a.txt。
- 閱讀。
- 打印其內容。
- 關閉並記錄文件已關閉。
- 再次打開它。
- 用新內容覆蓋它。
問題是,根據我得到的輸出,似乎我不控制這些事件的順序。這是我在控制檯得到的輸出:
剛讀21個字節/這是我的測試文件/只寫了30個字節/文件關閉,並準備寫
所以,你可以看到,對於一些在記錄該文件被關閉之前,程序正在寫入該文件。我試圖關閉它,記錄它已關閉,然後寫入文件。
所以我認爲我有一個控制事件流的問題。你能指出我做錯了什麼嗎?
這個代碼:
var fs = require('fs');
//What I am trying to do here is: open a file a.txt, read it, print its content and then //close the file and log that it has been closed.
//Then, open it again and overwrite it.
fs.open('a.txt', 'r', function(err, fd){
if(err){throw err;}
var readBuffer = new Buffer(1024);
var bufferOffset = 0;
var filePosition = 0;
var readBufferLength = readBuffer.length;
fs.read(fd, readBuffer, bufferOffset, readBufferLength, filePosition, function(err, readBytes){
if(err){throw err;}
console.log('just read ' + readBytes + ' bytes');
console.log(readBuffer.slice(0,readBytes).toString());
fs.close(fd,function(){
console.log('file close and ready for write');
});
});
});
fs.open('a.txt', 'r+', function(err,fd){
if(err){throw err;}
var writeBuffer = new Buffer('saul lugo overwrote this file!');
var bufferOffset = 0;
var writeBufferLength = writeBuffer.length;
var filePosition = null;
fs.write(fd, writeBuffer, bufferOffset, writeBufferLength, filePosition, function(err, writeBytes){
if(err){throw err;}
if(writeBytes>0){
console.log('just wrote ' + writeBytes + ' bytes.');
}
});
});