Порядок обработки событий в Adobe Flex / Actionscript - PullRequest
5 голосов
/ 18 октября 2010

Как можно проще, я пытаюсь выяснить, гарантированно ли обрабатываются события в порядке их отправки. Допустим, у меня есть следующий простой код:

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 ]

5 голосов
/ 19 октября 2010

Если два события отправляются одно за другим, как показано в вашем коде, второе событие будет отправлено только после того, как будут выполнены все обработчики первого события и будет возвращен метод 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));

Но если вы зарегистрировали двух слушателей, зарегистрированных для события с одинаковым приоритетом, они обрабатываются в том порядке, в котором они были добавлены. приоритет параметр метода 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 голос
/ 19 октября 2010

Так же ответ Роберта Бака. Если вам абсолютно необходимо сделать это по какой-либо причине, вы можете пометить события числом, которое увеличивается на единицу каждый раз, чтобы ваши слушатели просто сохранили их в какой-то центральной очереди, а затем отсортировали индекс, который вы присвоили. Вероятно, больше работы, чем стоит.

0 голосов
/ 09 ноября 2010

Обычно цикл событий начинается, когда происходит диспетчеризация события, переходит к его родителю, а затем поднимается по иерархии пользовательского интерфейса через других родителей, откуда он возвращается к своим дочерним элементам.Ниже приведена диаграмма, иллюстрирующая жизненный цикл события во Flex:

Flex event lifecycle

События проходят через разные фазы, но некоторые события могут быть ограничены определенными фазами.При создании нового события вы можете предотвратить его всплытие во время фазы пузырьков.Для получения более подробной информации прочитайте Essential ActionScript 3.0 Колина Моока.

События не инициируются и не обрабатываются ни в какой последовательности.Они зависят от того, когда происходит событие.Во Flex события асинхронны.

0 голосов
/ 19 октября 2010

Если бы Бог хотел, чтобы мы знали порядок, в котором будут происходить события, он бы не дал нам callLater ()

;)

0 голосов
/ 18 октября 2010

Обычно так и есть, но гарантии нет, поэтому не стоит полагать, что они будут.

...