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

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

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

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

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

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

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


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

Ответы [ 2 ]

5 голосов
/ 24 июня 2009

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

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

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

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

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

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

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

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