2011-05-05 72 views
0

For循環包含一個事件監聽器函數。但循環迭代比偵聽器函數更快。在偵聽器函數完成之前,下一次迭代開始。如何處理這個?如何管理for循環中的事件偵聽器?

+0

得到了一些示例代碼..?無法破譯你的目標。 – Marty 2011-05-05 06:49:54

+0

@ user732251你是什麼意思「循環迭代比偵聽器功能更快」?你的意思是你添加到你的對象的事件監聽器沒有收到一個事件,然後循環中的下一個對象添加了一個事件監聽器?如果您在描述問題時遇到問題,那麼您至少應該張貼一些代碼或描述您的項目的目的。我也很想知道爲什麼你首先需要這種功能。 – Taurayi 2011-05-05 11:59:30

+0

@ user732251應該詳細說明你的問題。提供一些代碼示例,就像你說的「for-loop」可以幫助我們,就像Marty所說的那樣 - 破譯你的目標。 – bigp 2011-05-05 14:12:32

回答

1

聽起來像你不需要一個「for」循環。

根據你的描述,它看起來像你需要某種形式的事件鏈的第一個事件完成後,你建立了一個新的偵聽器等等...

1

如果你要找的答案是帕特里克所描述的,我已經創建的如何實現它的一個例子:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 

    public class Main extends Sprite 
    { 
     private var _queue:Queue; 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var queueItems:Vector.<QueueItem> = new Vector.<QueueItem>(); 

      for (var i:uint = 0; i < 5; i++) 
      { 
       var timer:Timer = new Timer(2 * 1000, 1); 

       queueItems.push(new QueueItem(timer, TimerEvent.TIMER_COMPLETE, onTimerComplete)); 

      }// end for 

      _queue = new Queue(queueItems); 

      var currentTimer:Timer = Timer(_queue.currentQueueItem.eventDispatcher); 
      currentTimer.start(); 

      _queue.shift(); 

     }// end function 

     private function onTimerComplete(e:TimerEvent):void 
     { 
      if (_queue.currentQueueItem) 
      { 
       var currentTimer:Timer = Timer(_queue.currentQueueItem.eventDispatcher); 
       currentTimer.start(); 

       if (_queue.length > 0) _queue.shift(); 

      }// end if 

     }// end function 

    }// end class 

}// end package 

import flash.events.IEventDispatcher; 
import flash.events.Event; 

internal class Queue 
{ 
    private var _queueItems:Vector.<QueueItem>; 

    public function get currentQueueItem():QueueItem { return (_queueItems.length > 0) ? _queueItems[0] : null } 
    public function get length():int { return _queueItems.length } 

    public function Queue(queueItems:Vector.<QueueItem>) 
    { 
     _queueItems = queueItems; 

    }// end function 

    public function shift():void 
    { 
     var eventDispatcher:IEventDispatcher = _queueItems[0].eventDispatcher; 
     var type:String = _queueItems[0].type; 
     var listener:Function = _queueItems[0].listener; 
     var useCapture:Boolean = _queueItems[0].useCapture; 
     var priority:int = _queueItems[0].priority; 
     var useWeakReference:Boolean = _queueItems[0].useWeakReference; 

     eventDispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference); 

     _queueItems.shift(); 

    }// end function 

}// end class 

internal class QueueItem 
{ 
    private var _eventDispatcher:IEventDispatcher; 
    private var _type:String; 
    private var _listener:Function; 
    private var _useCapture:Boolean; 
    private var _priority:int; 
    private var _useWeakReference:Boolean; 

    public function get eventDispatcher():IEventDispatcher { return _eventDispatcher } 
    public function get type():String { return _type} 
    public function get listener():Function { return _listener } 
    public function get useCapture():Boolean { return _useCapture } 
    public function get priority():int { return _priority } 
    public function get useWeakReference():Boolean { return _useWeakReference } 

    public function QueueItem(eventDispatcher:IEventDispatcher, type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) 
    { 
     _eventDispatcher = eventDispatcher; 
     _type = type; 
     _listener = listener; 
     _useCapture = useCapture; 
     _priority = priority; 
     _useWeakReference = useWeakReference; 

    }// end function 

}// end class 

簡單地說,這將創建類似系統的隊列在隊列的前面添加一個事件監聽器IEventListener對象,當其加入隊列被移動。

以上顯示瞭如何將其與Timer對象配合使用。