flex addEventListenerと変数の代入

2011/09/30
addEventListener()の記述の後で変数の代入とかする。
※前に記述をいれるとタイミングによってはaddEventListener()がおかしくなる。

めも

非同期処理ってのが問題らしい。

非同期処理ってのは「順番に処理をする」ではなくて「順番に処理をキューに入れる。その後、順不同で実行していく」らしい。

※「シングルスレッドとマルチスレッドと非同期処理」でまとめてみた。

要は「addEventListener()」の前に変数の代入とか各処理をいれるとその処理が終わっていないのに「addEventListener()」の中身が実行されることがあるってこと。

addEventListenerの前後に処理をいれたときの流れ

さんぷる

URLの読み込み完了したら「complete!」を表示する。
※普通にやるとエラー求めている結果になってくれないのでTimer()を併用する。

ダメなサンプル

addEventListener()の前にURLの読み込みをする。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
  3.           xmlns:s="library://ns.adobe.com/flex/spark"
  4.           xmlns:mx="library://ns.adobe.com/flex/mx"
  5.           applicationComplete="onApplicationComplete()">
  6.  
  7.   <fx:Script>
  8.     <![CDATA[
  9.       public function onApplicationComplete():void
  10.       {
  11.         var loader:URLLoader = new URLLoader();
  12.         loader.load(new URLRequest("http://○○○○○.○○/"));
  13.  
  14.         var timer:Timer = new Timer(5000, 1);
  15.  
  16.         timer.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent):void
  17.         {
  18.           trace("timer!");
  19.           loader.addEventListener(Event.COMPLETE, onLoaderComplete);
  20.         });
  21.  
  22.         timer.start();
  23.       }
  24.  
  25.       public function onLoaderComplete(event:Event):void
  26.       {
  27.         trace("complete!");
  28.       }
  29.  
  30.     ]]>
  31.   </fx:Script>
  32.  
  33.   <fx:Declarations>
  34.     <!–– 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 ––>
  35.   </fx:Declarations>
  36. </s:WindowedApplication>

まず、URLを読み込みする。(12行目)
次にTimerを5秒にセットする。(14行目)
timer.addEventListener()でTIMER_COMPLETEの発生待ち。(16行目)
timer.start()でスタート。(22行目)
TIMER_COMPLETEが発生するので16行目のtimer.addEventListener()の内容に沿って処理の開始。
loader.addEventListener()でEvent.COMPLETEの発生待ち。(19行目)

もし、URLの読み込みでまだCOMPLETEが発生していなければ、これから「URLの読み込みのCOMPLETE」が発生し、19行目のloader.addEventListener()の内容に沿って処理を開始することができる。
※大概のサイトは5秒もあればCOMPLETE発生済み。loader.addEventListener()の実行後に「URLの読み込み後のCOMPLETEが発生」することは少ない。

「イベントの発生を待つ」ってのを実行する前に「イベントが発生」することがあるので「問題になる」ときがある。

OKなサンプル

addEventListener()の後にURLの読み込みをする。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
  3.           xmlns:s="library://ns.adobe.com/flex/spark"
  4.           xmlns:mx="library://ns.adobe.com/flex/mx"
  5.           applicationComplete="onApplicationComplete()">
  6.  
  7.   <fx:Script>
  8.     <![CDATA[
  9.       public function onApplicationComplete():void
  10.       {
  11.         var loader:URLLoader = new URLLoader();
  12.  
  13.         var timer:Timer = new Timer(5000, 1);
  14.  
  15.         timer.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent):void
  16.         {
  17.           trace("timer!");
  18.           loader.addEventListener(Event.COMPLETE, onLoaderComplete);
  19.           loader.load(new URLRequest("http://○○○○○.○○/"));
  20.         });
  21.  
  22.         timer.start();
  23.       }
  24.  
  25.       public function onLoaderComplete(event:Event):void
  26.       {
  27.         trace("complete!");
  28.       }
  29.  
  30.     ]]>
  31.   </fx:Script>
  32.  
  33.   <fx:Declarations>
  34.     <!–– 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 ––>
  35.   </fx:Declarations>
  36. </s:WindowedApplication>

まず、Timerを5秒にセットする。(13行目)
timer.addEventListener()でTIMER_COMPLETEの発生待ち。(15行目)
timer.start()でスタート。(22行目)
TIMER_COMPLETEが発生するので15行目のtimer.addEventListener()の内容に沿って処理の開始。
loader.addEventListener()でEvent.COMPLETEの発生待ち。(18行目)
URLを読み込みする。(19行目)
Event.COMPLETEの発生の監視待ちだから、問題なし。

「イベントの発生を待つ」ってのを実行した後に「イベントが発生」するので問題なし。

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい