繁体中文
设为首页
加入收藏
当前位置:学院首页 >> 电脑应用 >> IntervalManager的扩展

IntervalManager的扩展
2007-02-03 17:23:24  作者:未知  来源:蓝色理想  浏览次数:0  网友评论0  文字大小:【】【】【】 评分等级:0

IntervalManager, setInterval 的扩展

主要功能:
增加了停止, 暂停 interval 功能
增加了删除所有 interval 的方法
在每次触发 interval 的时候广播事件跟踪, 更高的可扩展性
解决了函数返回值出路的问题 -0-

如何使用


// 首先准备一下 array 的 prototype
Array.prototype.remove = function(index) {
 if (index == 0){
  this.shift();
 } else if (index == (this.length - 1)){
  this.pop();
 } else if (index > 0 && index < (this.length - 1) ){
  this.splice(index, 1);
 }
}
_global.ASSetPropFlags(Array.prototype, "remove", 1, 0);

// 导入包
import MirageSystem.utils.IntervalManager;

function test1 (arg1, arg2) {
 trace("scope : " + this);
 trace("arguments.length : " + arguments.length);
 for (var i in arguments) {
  trace("arg[" + i + "] : " + arguments[i]);
 }
}

// test2 是带返回值的例子
var test2ReturnValue:String;
function test2 () {
 trace("我是 test2");
 return "这里是 test2";
}

// test3 会被无限持续调用, 看看 test2ReturnValue 的改变吧
function test3 () {
 trace("我是 test3, test2ReturnValue 的结果是 : " + test2ReturnValue);
}


function test4 () {
 trace("我是 test4, 现在暂停 test3");
 intervalMgr3.pause();
}

function test5 () {
 trace("我是 test5, 恢复 test3");
 intervalMgr3.start();
}

function test6 () {
 trace("我是 test6, 释放所有 interval");
 IntervalManager.cleanUp();

}

function intervalMgr1_invoke (e:Object) {
 trace("intervalMgr1.currentCount : " + e.currentCount);
}
function intervalMgr1_stop (e:Object) {
 trace("intervalMgr1 已停止");
}

// 设置一个 interval, 第 1 个例子还包括了如何设置侦听器
var intervalMgr1:IntervalManager = IntervalManager.run(test1, 1000, ["arg1", "arg2"], true, 3, this);
intervalMgr1.addEventListener(IntervalManager.INVOKE, intervalMgr1_invoke);
intervalMgr1.addEventListener(IntervalManager.STOP, intervalMgr1_stop);
var intervalMgr2:IntervalManager = IntervalManager.run(test2, 1500, null, false, 1, this, [this, "test2ReturnValue"]);
var intervalMgr3:IntervalManager = IntervalManager.run(test3, 100);
var intervalMgr4:IntervalManager = IntervalManager.run(test4, 800, null, null, 1);
var intervalMgr5:IntervalManager = IntervalManager.run(test5, 1300, null, null, 1);
var intervalMgr6:IntervalManager = IntervalManager.run(test6, 5000);


下面是我的运行结果

scope : _level0
arguments.length : 2
arg[1] : arg2
arg[0] : arg1
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test4, 现在暂停 test3
intervalMgr1.currentCount : 2
scope : _level0
arguments.length : 2
arg[1] : arg2
arg[0] : arg1
我是 test5, 恢复 test3
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
intervalMgr1.currentCount : 3
scope : _level0
arguments.length : 2
arg[1] : arg2
arg[0] : arg1
intervalMgr1 已停止
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test6, 释放所有 interval

IntervalManager.as

代码拷贝框
/**
 * IntervalManager, 提供一组管理 interval 的功能
 *
 * @author kakera
 * @version 1.0
 */
class MirageSystem.utils.IntervalManager extends MirageSystem.core.EventObject
{
 //
 // 一些状态常量
 //
 
 public static var RUNNING:Number = 0;
 public static var STOPPED:Number = 1;
 public static var PAUSED:Number = 2;
 
 
 //
 // interval 被 invoke 的事件
 //
 public static var INVOKE:String = "invoke";
 public static var STOP:String = "stop";
 
 //
 // 存放所有 intervals
 //
 private static var intervals:Array = new Array();
 
 
 //
 // 用于保存变量, 这里为了优化输出 swf 的体积没有做相应的 getter / setter
 //
 
 public var id:Number;
 public var func:Function;
 public var interval:Number;
 public var totalCount:Number;
 public var scope:Object;
 public var args:Array;
 public var delay:Boolean;
 public var returnVar:String;
 public var returnScope:Object;
 public var hasReturnValue:Boolean;
 public var state:Number;
 public var intervalId:Number;
 public var currentCount:Number;
 
 /**
  * 设置一个新的 IntervalManager, 返回 IntervalManager 实例
  *
  * @usage
  * @param func 要执行的函数
  * @param interval 每次执行间隔
  * @param args 可选, 传递的参数
  * @param delay 可选, 确定首次执行的时间, 0 或者 interval 的时间
  * @param count 可选, 运行的间隔
  * @param scope 可选, 修改函数的执行范围, 起到 Delegate 的作用
  * @param returnValue 可选, 指定存放返回值的变量, 该数组的第 1 个元素是变量的范围, 第 2 个元素是变量的名称 (字符串表示)
  * @return
  */
 public static function run (func:Function, interval:Number, args:Array, delay:Boolean, count:Number, scope:Object, returnValue:Array):IntervalManager {
  var intervalMgr = new IntervalManager(func, interval, args, delay, count, scope, returnValue, intervals.length);
  intervals.push(intervalMgr);
  return intervalMgr;
 }
 
 
 /**
  * 释放所有的 interval
  *
  * @usage
  * @return
  */
 public static function cleanUp ():Void {
  for (var i in intervals)
   intervals[i].release();
 }
 
 
 
 private function IntervalManager (func:Function, interval:Number, args:Array, delay:Boolean, count:Number, scope:Object, returnValue:Array, id:Number) {
 
  //
  // 错误检查, 如果觉得多余可以注释掉. 减少文件尺寸
  //
 
  if (id == undefined)
   throw new Error("参数 id 不能为空");
  
  
  //
  // 根据 returnValue 参数确定该函数是否有返回值
  //
 
  if (returnValue instanceof Array) {
   if (returnValue.length != 2) {
    throw new Error("参数 returnValue 只能是长度为 2 的数组");
   }
   hasReturnValue = true;
  } else {
   hasReturnValue = false;
  }
  
  this.func = func;
  this.interval = interval;
  this.args = args;
  this.delay = delay;
  this.totalCount = count == undefined ? Infinity : count;
  this.currentCount = 0;
  this.scope = scope;
  this.id = id;
  this.returnScope = returnValue[0]
  this.returnVar = returnValue[1];
 
  start();
 }
 
 
 /**
  * 开始 interval
  *
  * @usage
  * @return
  */
 public function start ():Void {
 
  if (state != PAUSED) {
  
   //
   // 确定首次执行时间
   //
  
   if (delay)
    invoke(func);
  
   intervalId = setInterval(this, "invoke", interval, func);
 
  }
  setState(RUNNING);
 
 }

 

 /**
  * 停止 Interval, 或者可以通过使用 release 来释放 IntervalManager 实例
  *
  * @usage
  * @return
  */
 public function stop ():Void {
  //trace("stop()");
 
  //
  // 重置 currentCount 计数并清除 interval
  //
 

  dispatchEvent( {type : STOP, currentCount : currentCount, totalCount : totalCount} );
  currentCount = 0;
  clearInterval(intervalId);
  intervalId = 0;
  setState(STOPPED);
 }
 
 
 
 /**
  * 暂停 interval, 如果已经在暂停中则会恢复 interval
  *
  * @usage
  * @return
  */
 public function pause ():Void {
  if (state != PAUSED) {
   setState(PAUSED);
  } else {
   this.start();
  }
 }
 
 
 
 /**
  * 提供释放 IntervalManager 的功能, 虽然我不知道这么干到底有没有用 -_-,
  * 如果你觉得不需要可以改掉
  *
  * @usage
  * @return
  */
 public function release ():Void {
  //trace("release()");
 
  //
  // 直接使用 stop() 是调用不到的 -0-
  //
 
  this.stop();
 
 
  //
  // 移除数组中关联的 IntervalManager 实例
  //
 
  intervals.remove(id);
 
  //
  // 如果上面的句子报错, 请注释掉上面的, 并取消注释下面这句
  // intervals["remove"](id);
  //
  // 或者你可以通过为 Array 类增加一个方法 remove 来解决此问题
  //
 
 
  for (var i in this)
   delete this[i];
  
 }
 
 
 
 /**
  * 设置当前状态
  *
  * @usage
  * @param state
  * @return
  */
 private function setState (state:Number):Void {
  this.state = state;
 }
 
 
 
 /**
  * 调用方法的方法
  *
  * @usage
  * @param method 要调用的方法的引用
  * @return
  */
 private function invoke (method:Function):Void {
 
  //
  // 判断 count 是否继续循环, 否则释放循环
  //
 
  if (totalCount > currentCount) {
  
   //
   // 如果当前状态是暂停中就跳过
   //
  
   if (state != PAUSED) {
     currentCount++;
   
    //
    // 广播 INVOKE 事件, 返回当前执行了的次数和总次数
    //
   
    dispatchEvent( {type : INVOKE, currentCount : currentCount, totalCount : totalCount} );
   
   
    //
    // 判断是否有是有返回值的调用
    //
   
    if (hasReturnValue) {
     returnScope[returnVar] = method.apply(scope, args);
    } else {
     method.apply(scope, args);
    }
   }
  
   if (totalCount <= currentCount) {
    release();
   }
  
  } else {
   release();
  }
 }
 
}
 [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


EventObject.as
/**
 * EventObject
 *
 * @author kakera
 * @version 1.0
 */
class MirageSystem.core.EventObject
{
 private var dispatchEvent:Function;
 public var addEventListener:Function;
 public var removeEventListener:Function;
 
 private static var __MIX_IN__ = MirageSystem.event.EventDispatcher.initialize(EventObject.prototype);
 public function EventObject () {
 }

}

[Ctrl+A 全部选择 然后拷贝]

EventDispatcher.as
就是 mx.event.EventDispatcher -_-


本文引用地址:http://edu.yinaite.com/873.html

责任编辑:cxm

发表评论】 【加入收藏】 【告诉好友】 【打印本页】 【关闭窗口】 【返回顶部
相关评论 0条评论  发表/查看更多评论 
发表评论  【返回顶部】【关闭窗口】 
评分: 1 2 3 4 5

    
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。