Actionscript 3 删除的swf中的kill setTimeOut

Actionscript 3 删除的swf中的kill setTimeOut,actionscript-3,flash,Actionscript 3,Flash,//以下功能用于移除加载的swf private函数装入器kaldir() { 系统。暂停ForgCificCollectionImporting(0.50); 尝试 { 对于(var sts:int=0;sts请查看手册: 据说,setTimeout为定时进程返回uint-唯一的数字标识符。使用此标识符可通过调用clearTimeout()方法取消进程。 因此,如果要清除此超时,简单的clearTimeout(sts);将不起作用。您需要执行以下操作: var timeoutId = setT

//以下功能用于移除加载的swf
private函数装入器kaldir()
{
系统。暂停ForgCificCollectionImporting(0.50);
尝试
{
对于(var sts:int=0;sts请查看手册:

据说,
setTimeout
为定时进程返回
uint
-
唯一的数字标识符。使用此标识符可通过调用clearTimeout()方法取消进程。

因此,如果要清除此超时,简单的
clearTimeout(sts);
将不起作用。您需要执行以下操作:

var timeoutId = setTimeout(bkl,1000);
clearTimeout(timeoutId);
不确定这是否会在整个swf文件中起作用,但您始终可以在加载的swf中插入任何公共方法,您可以从父级调用该方法,因此可以在那里进行清除。

根据您是否使用
计时器而不是
设置超时
,它们将被停止

例如,可以按如下方式执行1秒超时:

var timer:Timer = new Timer(1000, 1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerComplete);
timer.start();

function timerComplete(e:TimerEvent):void {
    // do stuff
}
这样做需要一些额外的代码,但您可以将其封装在一个全局util函数中,就像
setTimeout

package {
    public function doTimeout(delay:uint, callback:Function):Timer {
        var timer:Timer = new Timer(delay, 1);
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent):void {
            timer.removeEventListener(TimerEvent.TIMER_COMPLETE, arguments.callee);
            callback();
        });
        timer.start();
        return timer;
    }
}
用法:

doTimeout(1000, callback);
注意:您可能需要将返回的
计时器
存储在某个地方,否则它可能会被垃圾收集。我不是100%确定

另一种选择是使用某种可以轻松清除所有超时的全局管理器:

public class Timeout {
    private static var timeouts:Vector.<int> = new <int>[];
    public static function add(delay:uint, callback:Function):int {
        var timeout:int = setTimeout(delay, callback);
        timeouts.push(timeout);
        return timeout;
    }
    public static function clearAll():void {
        for each(var id:int in timeouts){
            clearTimeout(id);
        }
    }
}
这将只清除设置的前20个超时。这是非常脆弱的。稍微好一点的解决方法是循环检查所有已启动的超时,这可能通过检查当前超时id来确定:

var i:uint = setTimeout(function(){}, 0);
while(i--)
    clearTimeout(i);
这仍然有点脆弱:我找不到任何文档来保证超时id实际上是有序的,尽管这似乎是一种行为。而且,假设一旦您达到
uint
的最大值,它将返回到0。尽管这是一个巨大的数字


另外,如果当前超时id非常大,循环可能会导致挂起。您可以通过只清除最后一个(比如1000个)超时来避免这种情况。总而言之,这是一个相当脆弱的解决方案。

一些AS3会很好…这很好,但我有超过100.000个。作为文件,我没有在任何设置超时时使用任何id,谢谢如果需要,您需要使用id您要清除超时:)我应该知道,在ı开始在这个项目中工作之前,ı不能更改侧加载swf中的代码,我需要一些东西,当ı删除加载的swf时,可以停止设置超时。您必须更改它。全局查找并用一个超时抽象替换
setTimeout
可能是最简单的。我将l处理您建议的代码,如果找不到更好的删除函数(var sts:int=0;sts)
cleatTimeout(sts)的问题,请将重点放在jsfl上,以替换setTimout
是指
sts
将仅从1到20,而计时器ID是一个增量值,这意味着在前20次
setTimeout
调用后,ID将大于20。因此,您的代码将停止工作。一个稍微聪明的方法是从0循环到当前超时ID。我将在原始答案中发布一个片段。..
var i:uint = setTimeout(function(){}, 0);
while(i--)
    clearTimeout(i);