2012-09-10 2 views

답변

2

본래 그 자체가 아닙니다.

다른 답변에서 설명한대로 SetTimeout은 아마도 가장 쉬운 내기 일 것입니다. 다음과 같이

public class Scheduler { 
    public var time:Date; 
    public var action:Function; 
    public var parameters:Array; 

    private var checkInterval:Number = NaN; 
    public function get interval():Number { return checkInterval; }; 
    public function set interval(val:Number):void { 
     checkInterval = val; 
     if (schedules && (mainTimer && mainTimer.delay > val)) { 
      mainTimer.delay = val; 
     } 
    } 

    public function Scheduler(time_:Date, action_:Function, interval_:Number = NaN, parameters_:Array = null):void { 
     time = time_; 
     action = action_; 
     checkInterval = interval_; 
     parameters = parameters_; 
    } 

    //static stuff 

    private static var mainTimer:Timer; 
    public static function stop():void { 
     if (mainTimer) { 
      mainTimer.stop(); 
     } 
    } 

    public static function start():void { 
     if (mainTimer && !mainTimer.running) { 
      mainTimer.start(); 
     } 
    } 

    public static function get curInterval():Number { return (mainTimer) ? mainTimer.delay : 0; }; 

    private static var scheduleList:Vector.<Scheduler>; 
    public static function get schedules():Vector.<Scheduler> { return scheduleList; }; 


    /** 
    * Schedules a function to run at a certain time (with the margin of the interval) 
    * @param time - what time to run this passed action 
    * @param action - a function to call between the time passing, and the next interval 
    * @param interval - how often to check if the time has come, default is 1 second 
    * @param ... rest - parameters to pass to the action method 
    * @return 
    */ 
    public static function scheduleAction(time:Date, action:Function, interval:Number = NaN, ... rest):Scheduler { 
     var s:Scheduler = new Scheduler(time, action, interval, rest); 

     //if already old 
     if (time.time < new Date().time) { 
      action.apply(null, rest); 
      return s; 
     } 

     if (!scheduleList) { 
      scheduleList = new Vector.<Scheduler>(); 
     } 

     scheduleList.push(s); 

     if (!mainTimer) { 
      mainTimer = new Timer(1000); 
      mainTimer.addEventListener(TimerEvent.TIMER, timerTick); 
      mainTimer.start(); 
     } 

     if (!isNaN(interval) && interval < mainTimer.delay) { 
      mainTimer.delay = interval; 
     } 

     return s; 
    } 

    private static function timerTick(e:TimerEvent):void { 
     var tmpDate:Date = new Date(); 
     for (var i:int = scheduleList.length-1; i >= 0;i--){ 
      if (tmpDate.time >= scheduleList[i].time.time) { 
       scheduleList[i].action.apply(null, scheduleList[i].parameters); 
       removeSchedule(i); 
      } 
     } 

     checkTimerNeeded(); 
    } 

    private static function checkTimerNeeded():void { 
     if (scheduleList && scheduleList.length < 1) { 
      mainTimer.stop(); 
      mainTimer.removeEventListener(TimerEvent.TIMER, timerTick); 
      mainTimer = null; 
      scheduleList = null; 
     } 
    } 

    private static function removeSchedule(index:int):void { 
     scheduleList.splice(index, 1); 
     checkTimerNeeded(); 
    } 

    /** 
    * Cancels a scheduled item 
    * @param s - the item to cancel 
    * @return returns true if the item was scheduled, false if the item wasn't scheduled 
    */ 
    public static function cancelSchedule(s:Scheduler):Boolean { 
     if (scheduleList) { 
      var index:int = scheduleList.indexOf(s); 
      if (index > 0) { 
       removeSchedule(index); 
       return true; 
      } 
     } 

     return false; 
    } 

    public static function status():void { 
     trace("isRunning:", (mainTimer) ? mainTimer.running : null); 
     trace("List Length:", scheduleList ? scheduleList.length : null); 
    } 
} 

사용 (대신 타이머의 setTimeout을 사용하도록 수정 될 수 있지만 타이머를 선호) : 당신은 당신이 예정 원했던 많은 일을 한 경우에, 여기를 관리 할 수있는 클래스입니다

여기
Scheduler.scheduleAction(myDateToRunTheFunction, myFunctionToRun, howOftenToCheckTime, functionParameter1, functionParameter2, functionParameter2); 
+0

이 방법을 발견 '수업, 나는 시도 해봐! 덕분에 @ LondonDrugs –

+0

어떻게 되었습니까? 이 기능의 장점은 예정된 모든 작업을 일시 중지 할 수 있다는 것입니다 (모달 상자를 방해하지 않으려는 경우), 취소하고 항상 대기열에있는 항목에 액세스 할 수 있습니다. – BadFeelingAboutThis

+0

도움을 주셔서 감사하지만 마침내 나는 해결하고 싶었던 문제를 위해 특별히 Timer 클래스를 사용하여 더 간단한 구현에서 제안을 사용했다. –

2

는이 기능을 실행하는 날짜에 걸리는, 그것을 할 수있는 방법입니다 긴 나는 '스케줄러의 구현을 좋아 다음 호출 기능을 실행할에서는 setTimeout

var date:Date = new Date(2012,9,13); 
schedule(myFunction,date); 

private function myFunction():void 
{ 
    trace("Schedule function run"); 
} 

private function schedule(func:Function,date:Date):void 
{ 
    var now:Date = new Date(); 

    if (date.time < now.time) 
     return; 
    var timetorun:Number = date.time - now.time; 
    setTimeout(func, timetorun); 
} 
관련 문제