Actionscript 3 - 处理事件是否与函数分开工作

Actionscript 3 - Does handling an event work separately than a function

假设我设置了一些事件处理程序,然后我有一个正在运行的循环,如果我触发事件,函数会被触发还是会卡住?

Flash 在大多数情况下是单线程的。这意味着它一次只能做一件事。 (您现在可以使用 Workers 来解决这个问题,但为了这个答案我们将忽略它们)

因此,只有在执行出现间隙时才会触发事件。如果你有一个循环 运行ning,那么在那个循环之前不会有这样的间隙,并且任何额外的代码都有 运行。

您问题的答案是 运行 直到循环结束。并且在代码执行期间触发的任何事件都会排队并在执行间隙出现时立即触发。

如果您在循环中调度事件,那么您的应用程序将响应它们。

如果您有一个循环在做它自己的事情,而您的分派事件的代码在循环之外,那么您的应用程序将不会在循环发生时获取这些事件。

在以下示例中,将调度事件:

for (var i:int;i<1000;i++) {
    // do something
    dispatchEvent(myEvent);
} 

...将不会调度事件:

for (var i:int;i<1000;i++) {
    // do something
    // no events dispatched while in this loop
} 

dispatchEvent(myEvent);

如果您在 for 循环中的时间过长,AIR 或 Flash Player 运行时将 timeout

可能更好的方法是像其他张贴者那样使用 ActionScript worker,或者检查您进入循环的时间并在特定时间后跳出循环。然后你会把你的工作分成几块。

var landBeforeTime = getTimer();

for (var i:int;i<1000;i++) {
    // do something
    // check we aren't taking too long
    if (getTimer()-landBeforeTime>1000){
       notDone = true;
       break;
    }
} 

if (notDone) {
     // come back in the next frame and finish this loop
     setTimeout (myForLoop, 100);
}

前面的代码是一个例子。您需要使用 enterFrame 并进行整理。