Можно ли использовать цикл while в Actionscript для отслеживания событий? - PullRequest
0 голосов
/ 25 апреля 2009

Я создаю библиотеку сценариев действий. Я вызываю некоторые API, которые анализируют некоторые xml и получают результат. Он отправляет Event.COMPLETE, когда анализ завершен. Я хочу отслеживать, отправляется ли это событие в некотором цикле while, например "while (eventnotdispatched)" Является ли это возможным? Я знаю, что другой путь был бы для addeventlistener. Но, пожалуйста, дайте мне знать, если другое возможно.

Спасибо

Ответы [ 5 ]

3 голосов
/ 25 апреля 2009

НЕТ, это невозможно. Actionscript является однопоточным. Таким образом, пока вы ожидаете в цикле while, это единственный работающий поток, и ожидаемый вами процесс никогда не сможет завершиться. Вот почему все делается с событиями, так что это то, что вы должны использовать. Если вам нужно периодически обновлять дисплей, пока вы ждете что-то для завершения ... снова, используйте события. Создайте объект Timer, который генерирует событие TIMER время от времени, и используйте его для обновления.

1 голос
/ 25 апреля 2009

РЕДАКТИРОВАТЬ: Давр прав, вы не сможете использовать цикл while, как это. Вам понадобится таймер.

Да, можно опросить. НО вам все равно нужно будет создать прослушиватель событий. Это будет работать примерно так:

private var loadCompleted = false;
private var timer:Timer= new Timer(1);

private function onInitCompleted(event:Event):void
{

    timer.addEventListener(TimerEvent.TIMER, timerHandler);
    timer.start();
}

private function loadCompleteEventHandler(event:Event):void
{
    loadCompleted = true;
    ...
}

private function timerHandler()
{
    if(!loadCompleted)
    {
        ... // stop the timer or something.
        timer.stop();
    }
}

Обратите внимание, это ОЧЕНЬ ПЛОХОЙ код. Я бы НИКОГДА не использовал его в производстве, потому что Actionscript - это язык событий. Для этого не должно быть абсолютно НИКАКОЙ ПРИЧИНЫ. Все, что вы пытаетесь сделать, может быть достигнуто с помощью другого метода, гораздо более простого. Скажите мне, что вы пытаетесь сделать с этим, и я представлю лучшее решение.

Извините за крик, уже поздно, и я сонный.

0 голосов
/ 27 февраля 2013

Вы пытаетесь обойти программирование на основе событий, что не очень хорошая идея. Это часто бывает, когда кто-то подходит от более старой модели и еще не имеет хорошей системы отсчета, чтобы оценить элегантность программирования, управляемого событиями.

События ваших друзей. Они работают очень хорошо. Ваш loadCompleteHandler - это все, что требуется. Хотите сделать что-то еще в ответ? Добавьте вызов в этот обработчик:

private function loadCompletedHandler(event:Event):void
{
    waitingObject.fileWasLoadedSoGoDoThatThing();
}

Нет необходимости усложнять это. Нет необходимости в семафоре или цикле для проверки семафора. Ненужные окружающие семафоры могут нарушить инкапсуляцию, которая может оградить вас от нежелательных побочных эффектов.

0 голосов
/ 28 января 2011

Я согласен с утверждениями о том, что это, вероятно, плохая идея, и цикл while определенно не сработает в ActionScript. Однако могут существовать законные причины для того, что вы пытаетесь сделать. Только вы можете предотвратить плохой код. Вместо того, чтобы судить, я просто получу ответ на ваш вопрос.

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

Итак ... у вас есть объект weirdXmlObj со свойством загружен , который по умолчанию равен false , но переходит к true , когда XML загружен.

В этом случае, с небольшими изменениями, код, размещенный CookieOfFortune, фактически будет работать. Вам не понадобится функция loadCompleteEventHandler (которая так или иначе никогда не была присоединена), и в обработчике таймера вы просто проверите if (weirdXmlObj.loaded) и затем выполните ветвление, как вам бы того хотелось.

Ах, но может быть и более простой способ, в зависимости от того, что вы делаете. Если у вас есть экранный объект под рукой. (то есть что-то, что имеет смысл, а не какой-то случайный объект.) Вы можете присоединить свой код к событию EnterFrame стадии вместо использования таймера.

myDisplayObject.stage.addEventListner (Event.ENTER_FRAME, frameEnterHandler);

Несколько вещей, о которых следует знать:

  1. На самом деле вам даже не нужно переходить на уровень сцены, все экранные объекты поддерживают событие EnterFrame, но это хорошее место для подключения прослушивателя событий.

  2. Вы действительно должны сводить к минимуму все вызовы функции. В частности, действительная функция frameEnterHandler не должна делать ничего больше, чем проверка if (weirdXmlObj.loaded) .

0 голосов
/ 25 апреля 2009

Это означает принудительное выполнение синхронной модели выполнения для базовой асинхронной модели (которая работает с обратными вызовами).

Чего именно вы пытаетесь достичь, и почему бы не использовать обратный вызов?

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