尽可能简单,我试图找出是否保证按照调度顺序处理事件。假设我有以下简单的代码:
private function handler1(e:Event):void { .. processing ..}
private function handler2(e:Event):void { .. processing ..}
private function handler3(e:Event):void { .. processing ..}
<SomeComponent myEvent1="handler1(event)" myEvent2="handler2(event)" myEvent3="handler3(event)" ... />
如果在我的应用程序中的某个地方(来自组件本身或其他实例化组件的地方),如果我按照1,2,3的顺序发送这些事件,如:
dispatchEvent(new Event('myEvent1'));
dispatchEvent(new Event('myEvent2'));
dispatchEvent(new Event('myEvent3'));
这些处理程序是否保证以相同的顺序触发(即handler1,handler2,handler3)......?我搜索互联网(阅读:谷歌)的任何关于“adobe事件处理订单”或任何类似的东西只是指事件生命周期。虽然我找不到任何关于这个特定的细微差别的东西。非常感谢任何帮助。
- 伊恩
答案 0 :(得分:5)
如果代码中显示了一个接一个地调度了两个事件,则只有在执行第一个事件的所有处理程序并返回dispatchEvent
方法后才会调度第二个事件。
private function handler_1(e:Event):void {}
private function handler_2(e:Event):void {}
a.addEventListener(Event.TYPE_1, handler_1);
a.addEventListener(Event.TYPE_2, handler_2);
//Different events:
//handler_1 will be called before handler_2
a.dispatchEvent(new Event(Event.TYPE_1));
a.dispatchEvent(new Event(Event.TYPE_2));
但是,如果您已经注册了两个以相同优先级注册的侦听器,那么它们将按照添加顺序进行处理。
private function handler_1(e:Event):void {}
private function handler_2(e:Event):void {}
a.addEventListener(Event.TYPE_1, handler_1);
a.addEventListener(Event.TYPE_1, handler_2);
/*
Same event, same priority:
Called based on the order in which they were added;
Hence handler_1 is called first.
*/
a.dispatchEvent(new Event(Event.TYPE_1));
您可以使用addEventListener
方法的priority参数来强制执行订单:
a.addEventListener(Event.TYPE_1, handler_1, false, 0);
a.addEventListener(Event.TYPE_1, handler_2, false, 1);//higher priority
/*
handler_2 will be invoked before handler_1
*/
a.dispatchEvent(new Event(Event.TYPE_1));
答案 1 :(得分:1)
Ditto Robert Bak的回应。如果您绝对需要 - 无论出于何种原因使这项工作成功,您可以使用每次增加1的数字标记事件,让您的侦听器仅将它们存储在某种中央队列中,然后根据您指定的索引。可能比它的价值更多的工作。
答案 2 :(得分:0)
他们通常这样做,但不能保证,所以你不应该假设他们会这样做。
答案 3 :(得分:0)
如果上帝让我们知道事件将发生的顺序,他就不会给我们打电话来()
)
答案 4 :(得分:0)
通常情况下,事件周期在事件发送发生时开始,转到其父级,然后通过其他父级从UI层次结构开始,从中返回到子级。下面的图表说明了Flex中的事件生命周期:
事件经历了不同的阶段,但某些事件可能会受到某些阶段的限制。创建新事件时,可以防止事件在冒泡阶段冒泡。有关详细信息,请阅读Colin Moock的Essential ActionScript 3.0 。
不会以任何顺序触发或处理事件。他们取决于事件何时被解雇。在Flex中,事件是异步的。