理智地、负责任地、透明地推广Firefox
您可能也对这些感兴趣
切换

关于延迟的实现(讨论)

前段时间在某处看到一个用setInterval实现延迟的东西,用起来屡试不爽。不过后来也发现这其中的麻烦,主要是setInterval本身带来的麻烦,不知道有没有人有好的Idea。

首先来说一下用setInterval如何实现延迟。
基本功能相比大家都知道了,就不再赘述了。看代码,一目了然:

var myInterval = setInterval(myfun,_delay,para...);
function myfun(){
trace("this will be shown after xxxx(delay) ms");
clearInterval(myInterval);
}

比如:

var myInterval = setInterval(myfunction,1000);

function myfunction(){
trace("this will be shown after 1 second");
clearInterval(myInterval);
}

这里我也顺便了解到了一个很长时间都没有注意的细节,setInterval的机制是,第一次执行前要先等候interval的时间间隔(不知道是不是MM特别为了大家来做延迟)

然后,我把这个延迟封装成了一个function,如下:

//p1,p2为参数(Parametres)的个数
function delayer(funname, delaytime, p1, p2) {
var funname:Function;
var delaytime:Number;
var _fun:Function = function () {
funname();
clearInterval(intervalID);

};
var intervalID = setInterval(_fun, delaytime);
}[/code]例如:

function delayer(funname, delaytime, p1, p2) {
var funname:Function;
var delaytime:Number;
var _fun:Function = function () {
funname(p1,p2);
clearInterval(intervalID);
};
var intervalID = setInterval(_fun, delaytime);
}
delayer(a, 1000, 2, 3);
function a(t1, t2) {
trace(t1);
trace(t2);
}

到此为止,似乎这件事情就结束了,比较精确的延迟也已经基本实现了(我们可以定义延迟的时间,这就跟C++比较像了)

可是,郁闷的事情是,如何在外部找到这个延迟,并且消除呢?
这听起来有些匪夷所思,但是实际解决的过程中却让我很头痛,其中包括我一直都弄不明白的intervalID这个概念。

是这样的,我要做一段动画,依次出现一些MC。他们都是用AS根据XML动态生成的,所以必然要用到延迟配合Tween类来实现。

这样我就用:

delayer(getThis.myFun, 500*k, 0x000000, .2);//后面两个是参数
这里 500*k是延迟的时间,k是套在一个for循环中的递增变量,500*k,就表示每0.5秒调用getThis的myFun函数(这里getThis在循环中依次只想不通的MC,于是可以实现前面说的动态效果)

播放一次,问题还好。可是如果我想要在中途让它停下来就麻烦了。比如,依次要出现10个长方体,第一个渐变出来,然后是第二个,然后是第三个。如果作品要求要在按下某一个按钮的时候全部重新出现(即回到一个都没有的时候,再来依次逐级出现)就麻烦了。这时候,再调用delayer函数的时候,后面五个就会出现混乱(有点覆水难收的感觉,因为delayer的调用本身是一蹴而就的,即那个for循环在一瞬间就给不同的MC安置了不同的延迟)

于是我尝试提前clearInterval,可是这似乎也不是一个好办法,因为这个intervalID是存在于function内部的一个变量,在外面要把它捕捉到,太麻烦了,而且它本身也不方便保存出来(是一组随着你不断调用那个delayer函数不断增大的数字)

不知道各位有没有对setInterval的机制比较深入研究过的,我十分想知道如何在外部捕获这样一些不停调用的intervalID。或者是不是我的延迟思路彻底错误了?

: http://www.awflasher.com/blog/archives/282

哇!跟我一样,您也是一名Firefox用户,这些话题您可能感兴趣:

RSS feed | Trackback URI

才 5 条评论 ( 展开所有评论 | 收起所有评论 ) 立刻发表评论 »

Jove
2005-07-06 17:07:38

可以把setInterval的返回结果保存在一个数组中,如果有必要则逐个调用clearInterval

aw
2005-07-06 19:48:20

看来也只有如此了,多谢J大牛:)

sword
2005-08-17 15:29:34

跟你碰到同样的问题,我也屡试不爽!播放一次的时候OK!如果重新加载播放第二次的时候!问题就出现了!也尝试过clearInterval等等方法,还是解决不了!

JOVE说的逐个调用clearInterval,你有试过吗,能解决这个问题吗,这点倒是没尝试!

有对setInterval的机制深入研究的朋友请回复哦!

aw
2005-08-17 17:04:10

目前找到了动态改变interval的方法,其实很简单,用一个
clearInterval(_global.intervalID);

_global.intervalID = setInterval();
之前,就可以动态改变,比如用FSlider组件监控调用频率。

但是还是无法实现延迟,或者暂停(理论上interval -> Inf)

岁岁年年
2007-08-14 15:44:33

不知道这是哪个环境下的函数呢?asp?。net?php???