私は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.');
}
});
});