Adobe Flex / Actionscript事件处理顺序

时间:2010-10-18 17:15:32

标签: flex events actionscript adobe

尽可能简单,我试图找出是否保证按照调度顺序处理事件。假设我有以下简单的代码:

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事件处理订单”或任何类似的东西只是指事件生命周期。虽然我找不到任何关于这个特定的细微差别的东西。非常感谢任何帮助。

- 伊恩

5 个答案:

答案 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中的事件生命周期:

Flex event lifecycle

事件经历了不同的阶段,但某些事件可能会受到某些阶段的限制。创建新事件时,可以防止事件在冒泡阶段冒泡。有关详细信息,请阅读Colin Moock的Essential ActionScript 3.0

不会以任何顺序触发或处理事件。他们取决于事件何时被解雇。在Flex中,事件是异步的。