ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Windowsでnode.js:ファイルの読み書きと同期、非同期

2012-01-11 13:53:02 | トピックス
昨日の、node.jsのつづき。




■同期して、読み書き

 node.jsで、ファイルを読み書きする場合、2通りの方法がある
    同期して読み書き
    非同期読み書き

 同期の場合は、メソッドに、Syncをつける
 こんなかんじ。

var sys = require('sys');
var http = require('http');
var fs = require('fs');
var outdata;


var server = http.createServer(
    function (request, response) {
	response.writeHead(200, {'Content-Type': 'text/plain'});
	buf = fs.readFileSync('./helloworld.js',"utf-8");
	fs.writeFileSync('./helloworld2.js', buf, 'utf8');
	response.write(buf);
	response.end();
    }
).listen(8124);

 
sys.log('Server running at http://127.0.0.1:8124/');



buf = fs.readFileSync('./helloworld.js',"utf-8");
fs.writeFileSync('./helloworld2.js', buf, 'utf8');

で、同期の読み書きをしている。
このプログラムは、http://127.0.0.1:8124/にアクセスすると、
  helloworld.jsのプログラム内容を表示し、
  その内容をhelloworld2.js
に書き出す

というもので、これは、問題なく、この処理をする。




■非同期で読み書き

 ところが、非同期(fs.readFile、fs.writeFile)で、同じことをしてみると、


var sys = require('sys');
var http = require('http');
var fs = require('fs');
var outdata;


var server = http.createServer(
function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
buf = "abc";
fs.readFile('./helloworld.js',"utf-8",function (err, data) {
buf = data;
});
fs.writeFile('./helloworld2.js', buf,"utf-8",function (err) {
});
response.write(buf);
response.end();
}
).listen(8124);


sys.log('Server running at http://127.0.0.1:8124/');



この結果は様々考えられるが、私のところでは、
画面には、abcと表示され、ファイルにもabcと書き出される。
つまり、readFileで指定したコールバック関数には、入っていない。

一方readFileを外に出すと、

var sys = require('sys');
var http = require('http');
var fs = require('fs');
var outdata;

buf = "abc";
fs.readFile('./helloworld.js',"utf-8",function (err, data) {
buf = data;
});

var server = http.createServer(
function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
fs.writeFile('./helloworld2.js', buf,"utf-8",function (err) {
});
response.write(buf);
response.end();
}
).listen(8124);


sys.log('Server running at http://127.0.0.1:8124/');


この結果も様々考えられるが、私のところでは、
helloworld.jsの内容が表示され、ファイルにも書き出される




■理由

 非同期だから。


 非同期の場合、readFileで読み込みが完了するのを待たずに、次のwriteFileの処理に入る。
 結果、2番目のケースでは、bufに読み込み内容がセットされる前に、次のwriteFileの処理に入ったので、bufの中身は書き換わらなかった。

 3番目のケースでは、ブラウザで表示する前に十分な時間があったから、読み込みが完了、bufにデータが入った状態で、writeFileの処理に入ったので中身を書き出せた。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

1月10日(火)のつぶやき

2012-01-11 03:04:51 | Twitter
01:28 from web
「八重洲無線株式会社」復活!!-バーテックススタンダードが「八重洲無線株式会社」に! http://t.co/p1YBnEyI
by xmldtp on Twitter

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする