Расстрел условий гонок в AS3 - PullRequest
1 голос
/ 02 декабря 2009

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

  • сохранить плакат в базу данных и отправить событие
  • вызывающая служба, событие отправки удалено = 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);
    }

Ответы [ 3 ]

1 голос
/ 02 декабря 2009

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

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);
}
0 голосов
/ 03 декабря 2009

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

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

0 голосов
/ 02 декабря 2009

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

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

...