ActionScript: когда выполняются обработчики событий?

Когда в ActionScript отправляется событие:

foo.addEventListener("some event", someHandler);
foo.dispatchEvent(new Event("some event"));

В какой момент выполняются обработчики событий?

Я спрашиваю, потому что поймал это в конце Руководство разработчика Adobe:

Обратите внимание, что некоторые свойства присваиваются [AsyncToken] после вызова удаленной службы. В многопоточном языке может возникнуть состояние гонки, при котором результат возвращается до того, как будет назначен токен. Эта ситуация не является проблемой в ActionScript, поскольку удаленный вызов не может быть инициирован до завершения текущего выполняемого кода.

Но я не смог найти никакой информации о том, что они имели в виду под «выполняющимся в данный момент кодом».


См. Также: Порядок выполнения обработчика событий ActionScript


person David Wolever    schedule 23.06.2009    source источник


Ответы (2)


ActionScript - это однопоточный язык, управляемый событиями. Обратите внимание, что в ActionScript нет «основных» методов. Весь код принадлежит событиям, например. код инициализации обычно помещается в ответ на события «creationComplete». После запуска кода в этом обработчике событий выполняется следующее событие. Итак, если вы это сделали:

private function someOtherHandler():void 
{
    foo.addEventListener("some event", someHandler);
    while(true) { ... spin wheels ... }
}

Никакой другой обработчик не сможет работать, потому что текущий исполняемый код (бесконечный цикл) никогда не завершится.

Обратите внимание, что Flash, вероятно, использует несколько потоков внутри, но это не зависит от разработчика.

person CookieOfFortune    schedule 23.06.2009
comment
Ах, это именно то, что мне было нужно. Спасибо за разъяснения. - person David Wolever; 23.06.2009
comment
Значит ли это, что если я отправлю два события одно за другим (foo.dispatch (a), foo.dispatch (b)), я могу гарантировать, что обработчик события 'a' будет выполнен до того, как обработчик для 'b'? Или есть некоторая доля недетерминизма, когда дело доходит до выполнения обработчиков? - person David Wolever; 23.06.2009
comment
Нет, есть разница между звонком и получением результата. Обработчик будет вызываться асинхронно, b может вернуться до a. Это просто означает, что если a возвращается первым, весь код в обработчике a будет запущен до того, как обработчик b сможет работать. - person Ryan Guill; 23.06.2009
comment
Спасибо за комментарий, Райан ... Хотя я не уверен, что понимаю. Когда вы говорите, что обработчик будет вызываться асинхронно, что вы имеете в виду? Что еще будет работать одновременно? Или что-то мне не хватает? - person David Wolever; 23.06.2009
comment
Или есть какой-нибудь хороший ресурс для изучения основных моментов реализации? Поиск в Google просто открывает страницы, относящиеся к / using / events :( - person David Wolever; 23.06.2009
comment
это лучшее место, чтобы начать узнавать о событиях: liveocs.adobe.com/flex/3/html/ Однако, чтобы расширить мой ответ выше, допустим, у вас есть два возвращающихся результата. Помните, что результаты являются асинхронными, поэтому даже если вы вызвали a до b, b может и иногда будет возвращаться до a. Приведенный выше текст означает, что какой бы результат ни вернулся раньше, весь код в этой функции-обработчике будет выполнен до того, как будет выполнена вторая функция-обработчик. Это более ясно? Трудно точно описать словами. - person Ryan Guill; 23.06.2009
comment
Что вы имеете в виду под возвращением двух результатов? И, если обработчик события b может вернуться до обработчика события a, что вызовет выполнение того и другого? Из некоторых экспериментов, которые я провел, кажется / похоже / что события обрабатываются, как только они отправляются, за исключением внешних событий (таких как щелчки, билеты таймера, сетевой трафик и т. Д.), Которые помещаются в очередь для выполнения после текущий выполняющийся обработчик завершен. - person David Wolever; 23.06.2009
comment
Хотя похоже, что события выполняются по порядку, нет никакой гарантии, что это произойдет. - person CookieOfFortune; 23.06.2009
comment
ммм хорошо. Тем не менее, все еще пытаюсь найти официальную документацию по этому поводу ... Может быть, я открою новый вопрос по этому поводу. Спасибо за помощь. - person David Wolever; 23.06.2009
comment
Хорошо, формализованный и очищенный вопрос здесь: stackoverflow.com / questions / 1033661 / - person David Wolever; 23.06.2009

Если вы вызовете dispatchEvent() в ActionScript, обработчики будут выполнены немедленно. Порядок определяется сначала приоритетом, указанным при вызове addEventListener(), а затем порядком, в котором они были добавлены, если приоритеты одинаковы. Первым прибыл - первым обслужен Эквивалент в русском языке: поздний гость гложет и кость.

Если событие отправляется внутренне из Flash Player, например Event.COMPLETE из экземпляра URLLoader или чего-либо еще, требующего сетевого взаимодействия, оно не будет отправлено во время выполнения ActionScript. Он ставится в очередь на потом. Я полагаю, что это сделано для того, чтобы избежать состояния гонки, описанного в документации. Я считаю, что было замечено, что «позже» - это следующий кадр, но это могло произойти после того, как все остальные ActionScript для текущего кадра были выполнены.

person Josh Tynjala    schedule 23.06.2009