Вопрос по events – Порядок выполнения обработчика событий ActionScript

3

Я пытался понять, как реализованы события ActionScript, но я застрял.

Я знаю, что AS является однопоточным, что означает, что одновременно будет выполняться только один обработчик событий, а также означает, что обработчики будут выполняться в детерминированном порядке *.

Например, рассмотрим следующий код:

<code>1: var x = {executed: false};
2: foo.addEventListener("execute", function(){ x.executed = true; });
3: foo.dispatchEvent(new Event("execute"));
4: assert(x.executed);
</code>

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

Но поскольку AS не является многопоточным, само собой разумеется, что утверждениеalways терпеть неудачу & # XB2; или жеalways успеха & # xB3 ;. Или, другими словами, события будут обрабатываться детерминистическим способом.

So, is this assumption (that events hare handled deterministically) correct? Does Adobe provide any definitive documentation on the matter?

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

*: за исключением, конечно, для событий, вызванных недетерминированными вещами, такими как пользовательский ввод или сетевой трафик.
& # xB2 ;: он всегда будет терпеть неудачу, если, например, если бы алгоритм обработки событий был: "помещать новые события в стек, затем непрерывно извлекать верхнее событие из стека, выполнять его до его завершения, а затем переходить к следующее событие & quot ;.
& # xB3 ;: это всегда будет успешным, если события отправляютсяdispatchEvent были обработаны, как только они были отправлены.

Ваш Ответ

2   ответа
7

Если только я не неправильно понял - в таком случае я прошу прощения! - Я не согласен с остальными: вам нужно только протестировать предоставленный вами код, чтобы каждый раз видеть значение 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 registers event listeners in the order in which the addEventListener() methods are called. Flex then calls the listener functions when the event occurs in the order in which they were registered. However, if you register some event listeners inline and some with the addEventListener() method, the order in which the listeners are called for a single event can be unpredictable.

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

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

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

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

К сожалению, экспериментальным путем это не соответствует действительности :( David Wolever
@CookieOfFortune. Я боюсь, что вы не правы. Диспетчеризация / обработка событий не обязательно является асинхронной.

Похожие вопросы