Adobe Flex/Actionscript事件处理顺序

4
尽可能简单地说,我想知道事件是否保证按照分派的顺序处理。假设我有以下简单代码:
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)...? 无论我在互联网上搜索(阅读:Google)有关“adobe事件处理顺序”或类似内容的任何内容都只涉及事件生命周期。 尽管如此,我仍然找不到关于这个特定细微差别的任何信息。 非常感谢您的帮助。
- Ian
5个回答

4
如果根据您的代码连续触发了两个事件,那么第二个事件只会在第一个事件的所有处理程序都执行完毕且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 方法的 优先级 参数来强制执行顺序:
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
同意Robert Bak的回答。但如果你有绝对必要让它工作,你可以给事件打上一个数字标签,每次递增一,让你的监听器仅将它们存储在某种中央队列中,然后根据你分配的索引进行排序。不过这可能比它值得的工作还要多。

0
通常,事件循环在事件分发发生时开始,经过其父级,然后通过其他父级向上遍历UI层次结构,再通过其子级向下遍历。下面是一个示意图,说明了Flex中的事件生命周期。

Flex event lifecycle

事件经历不同的阶段,但某些事件可以被限制在特定的阶段。创建新事件时,您可以防止事件在冒泡阶段向上冒泡。有关详细信息,请阅读Colin Moock的Essential ActionScript 3.0

事件不按任何顺序触发或处理。它们取决于事件何时被触发。在Flex中,事件是异步的。


0

他们通常会这样做,但并不保证,所以你不应该假设他们会。


我在Adobe论坛上看到了这个相互矛盾的答案: http://forums.adobe.com/thread/739912?tstart=0 - istrasci

0
如果上帝本意让我们知道事件发生的顺序,他就不会给我们 callLater()。 ;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接