小林 (koichik) です.

書籍からのコードということなので、コピペされたのが
最終的なコードではなく、読み進めるとさらに
改善されていくのかもしれませんが、ちょっと気になる
ところがあったので、勝手ながら少し課題を出させて
いただきますw

少し前の話題でも出てましたが、非同期 API での処理順は

...   //(1)
foo(hoge, function(err) {
  ... //(2)
});
...   //(3)

(1)->(3)->(2) となります。
これが二つ続くと、

...   //(1)
foo(hoge, function(err) {
  ... //(2)
});
...   //(3)
bar(moge, function(err) {
  ... //(4)
});
...   //(5)

(1)->(3)->(5)->(2)->(4) となる。。。 保証はなく、
(1)->(3)->(5)->(4)->(2) となる可能性もあります。

掲載されたコードはコールバックだけではなく
EventEmitter も使っているので少しわかりにくいかも
しれませんが、以下の部分が上記と似た構造になってます。

...   //(1)
var s = fs.createReadStream(f).once('open', function () {
  ... //(2)
  this.pipe(response);
});
...   //(3)
fs.stat(f, function(err, stats) {
  ... //(4)
  s.on('data', function(data) {
  });
});

実際に重要なのは、(2) の後にストリーム s は
'data' イベントを生成する準備が整うということです。
# pipe() は 'data' イベントのリスナを登録します。
# たぶん本に書いてあると思います。

さて、前述のように (4) の部分は (2) の部分よりも
先に実行されることもあれば、後から実行されることも
あり得るはずですが、たとえば fs.stat() の実行に
すごく時間がかかったらどうなるでしょうか?
つまり、(4) の部分が実行されるタイミングが、
(2) の部分やその後 'data' イベントが生成されるよりも
ずっと遅くなってしまったら?

そのような場合でもうまく動きますか?
どんな場合でもうまく動くようにするには
どうしたらいいでしょうか?



On Mon, 15 Apr 2013 06:18:31 -0700 (PDT), aporo4000 <[email protected]> 
wrote:

> いまちょうどそれを勉強してる初心者なので、みなさんみたいにスラスラ書いたり出来るように頑張ります!
> 
> -- 
> 
> --- 
> このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、[email protected] にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
> 


-- 
{
  name: "Koichi Kobayashi",
  mail: "[email protected]",
  blog: "http://d.hatena.ne.jp/koichik/";,
  twitter: "@koichik"
}

-- 

--- 
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、[email protected] にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。


メールによる返信