2009-06-23 3 views
3

Я пытался понять, как реализованы события ActionScript, но я застрял.Порядок выполнения обработчика события 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); 

Если ActionScript был многопоточный, можно было бы, что утверждение на линии 4 может не иногда и успеха других.

Но поскольку AS не многопоточный, само собой разумеется, что утверждение будет либо всегда fail² или всегда succeed³. Или, другими словами, события будут решаться детерминированным образом.

Итак, это предположение (что дело займется детерминированным делом) правильно? Предоставляет ли Adobe какую-либо окончательную документацию по этому вопросу?

Примечания: Я только здесь дело с событиями, отправляемых dispatchEvent - Я понимаю, что «внешне посланный» событие (сетевой трафик, пользовательский ввод, таймеры тикают, и т.д.) ведет себя по-разному.


*: за исключением, конечно, для событий, вызванных недетерминированными вещи, как пользовательский ввод или сетевого трафика.
²: он всегда терпит неудачу, если, например, если алгоритм обработки событий был следующим: «вставляйте новые события в стек, затем непрерывно выпадаете верхнее событие из стека, выполняйте его до тех пор, пока оно не завершится, а затем перейдите к следующему мероприятие".
³: всегда было бы успешным, если бы события, отправленные dispatchEvent, были обработаны, как только они были отправлены.

ответ

7

Если я не ошибаюсь - в этом случае я извиняюсь! - Я должен не соглашаться с другими: вам нужно только проверить код, который вы отправили, чтобы каждый раз видеть значение x.executed traires true.

Например, если вместо вашего объекта Foo, вы должны были заменить собой IEventDispatcher (в данном случае я делаю так неявно, с моим объектом приложения и его обработчик 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> 

Конечно, существуют способы управления обработкой событий заказ (с использованием аргумента priority addEventListener) и различные фазы распространения событий для объектов в списке отображения (например, захват, таргетинг, барботирование - см. Flex docs для получения более подробной информации, here и here), но в подобной ситуации события действительно обрабатываются по существу встроенными и в порядке приоритета.Согласно документации:

Flex регистрирует Приемники событий в порядке, в котором addEventListener называются() методы. Затем Flex вызывает функции слушателя, когда событие происходит в том порядке, в котором они были зарегистрированы . Однако, если вы зарегистрируете , некоторые прослушиватели событий inline и некоторые с методом addEventListener(), , порядок, в котором слушатели , вызвал для одного события, может быть непредсказуемым.

Надеюсь, что это поможет!

+0

Спасибо за ответ. Я подозревал это, но я не знал, я хочу доверять своей интуиции без какого-либо подтверждения. –

-2

строка 4 ВСЕГДА будет выполняться перед обработчиком событий, поэтому выполненный всегда будет утверждать как false. По завершении функции обработчик выполнит.

Вы пункт 2 - это правильный способ взглянуть на него.

+0

К сожалению, на эксперименте это неверно :( –

+0

@CookieOfFortune. Я боюсь, что вы ошибаетесь. Диспетчерство/обработка событий не обязательно асинхронны. –

Смежные вопросы