在ActionScript中调度事件时:
foo.addEventListener("some event", someHandler);
foo.dispatchEvent(new Event("some event"));
事件处理程序在什么时候执行?
我问,因为我在Adobe developer guide结束时发现了这个:
请注意,在调用远程服务后,会将某些属性分配给[AsyncToken]。在多线程语言中,将存在竞争条件,其中结果在分配令牌之前返回。 这种情况在ActionScript中不是问题,因为在当前正在执行的代码完成之前无法启动远程调用。
但我找不到任何有关“当前执行代码”的含义的信息。
答案 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可能在内部使用多个线程,但这是从开发人员那里抽象出来的。