我正在学习nodejs。我很难理解异步函数的工作原理。我的问题与下面的代码有关。我正在尝试按照以下完全相同的顺序执行以下操作:
- 打开文件 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.');
}
});
});