【发布时间】:2016-03-16 14:51:00
【问题描述】:
假设我设置了一些事件处理程序,然后我有这个正在工作的循环,如果我触发事件,函数会被触发还是会卡住?
【问题讨论】:
-
不看实际代码就无法回答你的问题。
-
致点击“关闭”的人。不要投票关闭它。要求清楚。
标签: actionscript-3 loops events actionscript handler
假设我设置了一些事件处理程序,然后我有这个正在工作的循环,如果我触发事件,函数会被触发还是会卡住?
【问题讨论】:
标签: actionscript-3 loops events actionscript handler
Flash 在大多数情况下是单线程的。这意味着它一次只能做一件事。 (您现在可以使用 Workers 来解决这个问题,但为了这个答案,我们将忽略这些)
因此,只有在执行中有间隙时才会触发事件。如果您有一个循环正在运行,那么在该循环和任何其他代码运行之前不会有这样的差距。
您的问题的答案是在循环完成之前它不会运行。并且在代码执行期间触发的任何事件都会在执行间隙发生时排队并按顺序触发。
【讨论】:
如果您在循环中调度事件,那么您的应用程序将响应它们。
如果您有一个循环在做它自己的事情,而您调度事件的代码不在此范围内,那么您的应用程序在循环发生时将不会收到这些事件。
在以下示例中,将分派事件:
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 工作人员作为其他海报发布的人,或者检查您在循环中的时间并在特定时间后退出循环。然后,您会将您的工作分成几块。
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 并整理东西。
【讨论】: