正在加载...

关于延迟的实现(讨论)

前段时间在某处看到一个用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。或者是不是我的延迟思路彻底错误了?

还没找到您要的东西?Google试试看吧,
Google更注重原创、时效性好的文章:


本文相关评论: 才 5 条评论
  1. Jove 2005-07-06 05:07:38

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

  2. aw 2005-07-06 07:48:20

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

  3. sword 2005-08-17 03:29:34

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

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

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

  4. aw 2005-08-17 05:04:10

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

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

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

  5. 岁岁年年 2007-08-14 03:44:33

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

[支持Ctrl+Enter]为了我们大家和家人的安全,留言请慎重!
声明:
1、本站仅与见过面的个人博客交换链接,见此文
2、留言时的头像是Gravatar提供的服务。如果您有兴趣并且有闲暇时间,可以看看这里的介绍