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立即处理,它总是会成功.
除非我误解 - 在这种情况下,我道歉! - 我必须不同意其他人:你只需要测试你提交的代码,每次都看到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()方法注册一些内联事件侦听器和一些事件侦听器,则为单个事件调用侦听器的顺序可能是不可预测的.
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
2529 次 |
| 最近记录: |