【问题标题】:Cron jobs with Action Script 3.0使用 Action Script 3.0 的 Cron 作业
【发布时间】:2012-09-10 20:40:58
【问题描述】:

有没有办法使用 Action Script 3.0 安排任务(函数)在给定的日期/时间执行?我的意思是schedule(myFunction:Function, dateTime:Date)。谢谢

【问题讨论】:

    标签: actionscript-3 flash actionscript flash-cs5


    【解决方案1】:

    本身不是原生的。

    另一个答案中概述的 SetTimeout 可能是您最容易的选择。但是如果你有很多事情你想要安排,这里有一个可以管理它的类:(它可以修改为使用 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);
        }
    }
    

    如下使用:

    Scheduler.scheduleAction(myDateToRunTheFunction, myFunctionToRun, howOftenToCheckTime, functionParameter1, functionParameter2, functionParameter2);
    

    【讨论】:

    • 我喜欢'Scheduler'类的这个实现,我会试试的!谢谢@LondonDrugs
    • 效果如何?这样做的好处是,您可以暂停所有预定的事情发生(例如,如果您有不想被打扰的模态框),取消某些事情,并且始终可以访问队列中的内容。
    • 感谢您的帮助,但最后我在更简单的实现中使用了您的建议,使用 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      相关资源
      最近更新 更多