主题:  [技巧]清理setInterval

HBB

职务:普通成员
等级:1
金币:0.0
发贴:58
#12004/10/20 18:11:27


setInterval很不错,可以完全代替onEnterFrame,但是使用起来却有很多需要注意的地方

比如要用updateAfterEvent,强制刷屏
还有要记得用clearInterval(id);来停止掉setInterval,如果要在停止的地方忘记地址了,那是很恐怖的^^"

但是要当程序一大,到处都是setInterval的时候(当然这样的程序也不好),你会为了找setInterval的id在哪里..而忙呼

注意过id的人都知道id是一个number,在你调用setInterval的时候会返回一个number,而这个number会逐加,很像addListener中的_listener数组的length

那么一个停掉所有setInterval的笨办法
MAX = 1000;
for(var i=0;i<MAX;i++){
clearInterval(i);
}

定义一个足够大的数字,然后慢慢clear,这么做就可以停止掉所有的setInterval了,当然如果你使用了超过1000个不同的setInterval(- -||)那还会出掉问题

所以最好的办法
var tmpID:Number = setInterval(function(){},10);
while(--tmpID > 0)
clearInterval(tmpID);

先用setInterval建立一个空函数,这样tmpID就会得到一个目前所拥有的setInterval的个数,然后用while循环一次性搞定就可以了^^"
简单吧,这样,你在哪里用过setInterval都不要紧,因为我想flash内置的setInterval函数,一定有一个类似addListener中的_listener的数组,然后返回数组的长度


那么强化一下clearAll()方法

function clearAll(Void):Void {
    
    // others clear statement
    
    var tmpId:Number = setInterval(function () {}, 10);
    while (--tmpId>0)    clearInterval(tmpId);
}



////////////////////////////////////////////////

// 测试程序
function A(){trace("A";}
function B(){trace("B";}
function C(){trace("C";}
setInterval(A,50);
setInterval(B,50);
setInterval(C,50);

setInterval(clearAll,1000);

function clearAll(Void):Void {
    var tmpId:Number = setInterval(function () {}, 10);
    while (--tmpId>0)    clearInterval(tmpId);
}

详细点击



UndeadCraft

职务:版主
等级:4
金币:10.0
发贴:1993
#22004/10/21 9:05:08
一般很少用ID来clear的,都是这样:
var ko=setInterval(...);
clearInterval(ko);

不过如果你在没有clearInterval之前,再次设定了ko=setInerval(...)的话.再用clearInterval(ko);就不行了.就可以用到你所说循环清楚ID的办法了.不过怎么多次定义相同的呢?那就是写的程序有问题了. ;)



HBB

职务:普通成员
等级:1
金币:0.0
发贴:58
#32004/10/21 10:21:10
ko不就是id么
变量名字而已

难道不会用到吗???
如果做游戏的话,会很希望不同的mc在不同的时间调用不同的函数啊

而且如果你的var ko=setInterval();是在一个函数里,那么ko临时变量,你就不能在其他地方使用clearInterval(ko);来清理了^^

当然这只是一个方法而已,我这么做就可以封装clear场景中的interval了

编辑历史:[此帖最近一次被 hbbalfred 编辑过(编辑时间:2004-10-21 14:37:21)]


UndeadCraft

职务:版主
等级:4
金币:10.0
发贴:1993
#42004/10/22 8:56:20
ko不是id,你运行一下以下程序就明白了。
function a() {
	trace(b);
	b = setInterval(a, 1000);
}
var b = setInterval(a, 1000);



HBB

职务:普通成员
等级:1
金币:0.0
发贴:58
#52004/10/22 15:17:02
你上面的程序能证明ko不是id??

只是证明了一下flash中的范围链吧

我也被你弄糊涂了ko和id什么的
我说的id就是在使用一次setInterval以后返回的"在flash中已经使用setInterval的次数"



UndeadCraft

职务:版主
等级:4
金币:10.0
发贴:1993
#62004/10/22 17:17:59
呵呵,KO就不是你所说的使用次数。
你说的使用次数就是我说的ID
-_-!



HBB

职务:普通成员
等级:1
金币:0.0
发贴:58
#72004/10/22 17:34:49
汗....
晕到

我明白了,你的ko当前setInterval
而id是setInterval的次数

终于达成共识....我de中文又有所进步 -_-||