ActionScript:事件处理程序何时执行?

时间:2009-06-23 14:14:17

标签: flex actionscript-3 actionscript flex3 asynchronous

在ActionScript中调度事件时:

foo.addEventListener("some event", someHandler);
foo.dispatchEvent(new Event("some event"));

事件处理程序在什么时候执行?

我问,因为我在Adobe developer guide结束时发现了这个:

  

请注意,在调用远程服务后,会将某些属性分配给[AsyncToken]。在多线程语言中,将存在竞争条件,其中结果在分配令牌之前返回。 这种情况在ActionScript中不是问题,因为在当前正在执行的代码完成之前无法启动远程调用

但我找不到任何有关“当前执行代码”的含义的信息。


另请参阅:ActionScript event handler execution order

2 个答案:

答案 0 :(得分:5)

如果在ActionScript中调用dispatchEvent(),处理程序将立即执行。首先通过调用addEventListener()时指定的优先级确定顺序,然后根据优先级相同的顺序确定顺序。先到先得。

如果从Flash Player内部调度事件,例如来自Event.COMPLETE实例的URLLoader或其他需要网络通信的事件,则在ActionScript运行时不会调度该事件。它排队等待以后。我想这正是为了避免文档中描述的竞争条件。我相信已经观察到“后来”是下一帧,但它可能发生在当前帧的所有其他ActionScript运行之后。

答案 1 :(得分:4)

Actionscript是一种单线程事件驱动语言。请注意Actionscript中没有“main”方法。所有代码都属于事件,例如。初始化代码倾向于放置以响应“creationComplete”事件。运行该事件处理程序中的代码后,将执行下一个事件。所以,如果你这样做了:

private function someOtherHandler():void 
{
    foo.addEventListener("some event", someHandler);
    while(true) { ... spin wheels ... }
}

没有其他处理程序能够运行,因为当前正在执行的代码(无限循环)永远不会完成。

请注意,Flash可能在内部使用多个线程,但这是从开发人员那里抽象出来的。