ActionScript事件处理程序执行顺序

Dav*_*ver 3 apache-flex events actionscript flex3 actionscript-3

我一直试图理解ActionScript的事件实现方式,但我被困住了.

我知道AS是单线程的,这意味着一次只执行一个事件处理程序,这也意味着处理程序将以确定的顺序执行*.

例如,请考虑以下代码:

1: var x = {executed: false};
2: foo.addEventListener("execute", function(){ x.executed = true; });
3: foo.dispatchEvent(new Event("execute"));
4: assert(x.executed);
Run Code Online (Sandbox Code Playgroud)

如果ActionScript是多线程的,那么第4行的断言有时可能会失败并成功.

但由于AS是不是多线程的,它按理说,断言要么总是 fail²或总是 succeed³.或者,换句话说,事件将以确定的方式处理.

那么,这个假设(确定性地处理事件)是否正确?Adobe是否就此事提供了任何明确的文件?

注意:我关注发送的事件dispatchEvent- 我意识到"外部调度"事件(网络流量,用户输入,定时器滴答等)表现不同.


*:当然,例外情况是由用户输入或网络流量等非确定性事件触发的事件.
²:例如,如果事件处理算法是:"将新事件推送到堆栈,然后不断地从堆栈中弹出顶级事件,执行它直到它终止,然后继续下一个事件",它总是会失败.
³:如果发送的事件在发送后dispatchEvent立即处理,它总是会成功.

Chr*_*ato 7

除非我误解 - 在这种情况下,我道歉! - 我必须不同意其他人:你只需要测试你提交的代码,每次都看到x.executed trace的值是真的.

例如,如果代替你的foo对象,你要替换IEventDispatcher(在这种情况下我是隐式地使用我的app对象及其creationComplete处理程序),你会看到:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()">

    <mx:Script>
        <![CDATA[

            private function onCreationComplete():void
            {
                var x = {executed: false};
                addEventListener("execute", function() { x.executed = true; });
                trace(x.executed); // false
                dispatchEvent(new Event("execute"));
                trace(x.executed); // true
            }

        ]]>
    </mx:Script>

</mx:WindowedApplication>
Run Code Online (Sandbox Code Playgroud)

当然,有一些控制事件处理顺序的方法(使用addEventListener的优先级参数),以及显示列表上对象的事件传播的各个阶段(例如,捕获,定位,冒泡 - 请参阅Flex文档以获取详细信息,在这里这里),但在这种情况下,事件确实基本上是内联和优先顺序处理的.根据文件:

Flex按照调用addEventListener()方法的顺序注册事件侦听器.然后,当事件按照注册顺序发生时,Flex会调用侦听器函数.但是,如果您使用addEventListener()方法注册一些内联事件侦听器和一些事件侦听器,则为单个事件调用侦听器的顺序可能是不可预测的.

希望有所帮助!