小林 (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 にアクセスしてください。