イベントリスナーはいつ呼ばれるのか?

ActionScript3.0には「イベント」と呼ばれる概念がある。
「イベント」と言ってもフラグが立つあれではない。プログラミングにおける「イベント」だ。
「イベント」はファイルのロードが完了した時ユーザーがボタンをクリックした時など特定のタイミングで発行される。

var file:File = manager.load("script.xml");
file.addEventListener("complete", function(){trace("TEST,OK!!")});

ここで、「manager」と「File」は私の自作クラスなので、あまり深く考えないで欲しい。
注目すべきポイントは二行目

file.addEventListener("complete", function(){trace("TEST,OK!!")});

と書くことでイベントに対するリスナーを設定できると言うことだ。
では、リスナーを設定するとどうなるのか? そのイベントが発行されたときに「function(){trace("TEST,OK!!")」を実行することができるのである。


つまり、イベントというのは、「特定のタイミングで任意の処理を行う」プログラムを書くためにあるのだ。


だが、ここで一抹の不安が生じる。
先の例では、一行目でファイルのロード(読み込み)を始めている。
このファイルの読み込みが完了すると「complete」という名前のイベントが発生するのだ。
そして、二行目でそのイベントに対するリスナーを指定している。

では読み込むファイルが思ったよりも小さくて、一行目が終了したとたんイベントが発生してしまったらどうなるのか。
つまり、二行目でイベントリスナーを指定する前にイベントが発生してしまったら? イベントを受け取る準備ができていないのにイベントがやってきてしまったら?
網を編む前に魚の大群に出くわした漁師よろしく、悠然と通り過ぎる魚(イベント)をただ見ているしかなくなってしまうのではないか。これはバグのもとではないのか?


実験してみた。

var file:File = manager.load("script.xml");

for(var i:int=0; i<1000; i++) { trace("rara"); }

file.addEventListener("complete", function(){trace("TEST,OK!!")});


先ほどのプログラムの真中に一行追加されている。
これは、1000回「"rara"」という文字列を出力しなさいという意味だ。
デバッグ版のプレイヤーを使い、traceのログを取るような設定にしていると、traceの実行には結構な時間がかかる。
1000回まわせば3〜4秒はかかるだろう。
script.xmlはそんなに大きなファイルではないので、3〜4秒あれば確実にロードは終了する。
このプログラムを実行してみて、もし「TEST,OK!!」と表示されなければ魚は通り過ぎたことになる。


結果

「TEST,OK!!」と表示された。
ということは、魚はきちんと捕まったと言うことである。


ではなぜ魚を捕まえることができたのか?
これは推測だが、魚は無造作に泳いでいるわけではなくきちんと一列にしかも順番に並んでいて(キュー)、さらには、かってに泳いでいってしまわずに、こちらが 網に引っかかるべき魚か否か を分けるのを待っているのだと思う。
しかも、この作業は漁師さん一人でやっている(シングルスレッド)ので、漁師さんが網を編みあげるまで、魚は誰にも選別されない。
だから、魚はきちんと網にかかった。めでたしめでたし。


ということなのだ。……多分。