Порядок выполнения обработчика событий ActionScript - PullRequest
3 голосов
/ 23 июня 2009

Я пытался понять, как реализованы события 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², либо всегда success3. Или, другими словами, события будут обрабатываться детерминистическим способом.

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

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


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

Ответы [ 2 ]

7 голосов
/ 23 июня 2009

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

Например, если вместо вашего объекта 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>

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

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

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

0 голосов
/ 23 июня 2009

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

Твой пункт 2 - правильный взгляд на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...