События срабатывания состояния гонки в AS3

У меня есть некоторые проблемы со стрельбой и удалением событий в правильном порядке хроники. Код ниже дает следующий результат:

  • сохранить постер в БД и отправить событие
  • вызывающая служба, событие отправки удалено = false
  • вызывающая служба, событие отправки удалено = false
  • вызывающая служба, событие отправки удалено = true
  • сохранить постер в БД и отправить событие
  • сохранить постер в БД и отправить событие

конечно, это должно быть что-то вроде:

  • сохранить постер в БД и отправить событие
  • вызывающая служба, событие отправки удалено = true
  • сохранить постер в БД и отправить событие
  • вызывающая служба, событие отправки удалено = true
  • сохранить постер в БД и отправить событие
  • вызывающая служба, событие отправки удалено = true

Может кто-то помочь мне с этим? У меня заканчиваются идеи, как с этим справиться.

Спасибо!

    for(var i:int = 0;i< 3;i++){
        createPoster();         
    }

    function createPoster(){
        Main.db.savePoster();
        Main.db.addEventListener(Config.evt_SAVEPOSTER_READY, callService);
    }

    function callService(){
       Main.db.removeEventListener(Config.evt_SAVEPOSTER_READY, callService);
    }

person Community    schedule 02.12.2009    source источник


Ответы (3)


Проблема в том, что вы регистрируете одну и ту же функцию callService для одного и того же события Config.evt_SAVEPOSTER_READY на одном EvenDispatcher объектеdb. Итак, как только первый savePoster отправляет событие после успешного сохранения постера, db получает событие и вызываются три обработчика событий (в данном случае callService), поскольку callService зарегистрирован трижды. Таким образом, одним из решений будет отправка событий из Poster.

for(var i:int = 0;i< 3;i++){
  createPoster();
}
function createPoster(){
  poster = Main.db.savePoster();
  poster.addEventListener(Config.evt_SAVEPOSTER_READY, callService);
}
function callService(e:PosterEvent){
  e.target.removeEventListener(Config.evt_SAVEPOSTER_READY, callService);
}

person bhups    schedule 02.12.2009
comment
хм хороший момент. Я реализую это и вернусь к этому. Спасибо за полезный ответ! - person ; 03.12.2009

Вы проверяли, что происходит, когда вы перебираете только один элемент? Мне кажется, вы не правильно ставите свои процедуры в очередь.

Возможно, вы захотите добавить прослушиватель событий к вашему объекту Main.db только один раз и удалить его, когда вы успешно сохраните все свои «плакаты».

person Rey    schedule 02.12.2009
comment
Привет, спасибо за ответ. Да, я сделал, нет проблем при зацикливании один раз. Я поместил таймер в цикл for, и если я запускаю createPoster каждые 1000 миллисекунд, проблем не возникает. Похоже, что цикл for будет работать быстро, чтобы событие можно было удалить. - person ; 02.12.2009
comment
Добавление задержки для решения проблемы — слабая стратегия. Я мог бы опубликовать пример кода позже, чтобы объяснить мою точку зрения выше. - person Rey; 03.12.2009

Является ли вызов базы данных (Main.db.savePoster();) синхронным - он возвращается только после завершения действия? Поскольку вы вызываете addEventListener после вызова базы данных, прослушиватель событий (по крайней мере, для первой итерации) не будет вызываться, если вызов базы данных является синхронным.

Является ли Main.db одним и тем же экземпляром во всех трех итерациях? Если это так, вам не нужно трижды регистрировать для него один и тот же прослушиватель событий — достаточно одного раза. Вызовите addEventListener перед запуском цикла for. Сохраните счетчик для отслеживания количества вызовов callService и вызовите removeEventListener, как только счетчик достигнет количества циклов (в данном случае 3).

person Amarghosh    schedule 03.12.2009