1

我在以正确的编年史顺序触发和删除事件时遇到了一些麻烦。下面的代码给出了以下输出:

  • 将海报保存到数据库中,并发送事件
  • 调用服务,调度事件已移除 = 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);
    }
4

3 回答 3

1

问题是您正在为单个对象上callService的相同事件注册相同的函数。因此,在成功保存海报后,一旦第一次 savePoster 调度事件,db 就会接收到事件并调用三个 eventHandler(在本例中为 callService),因为 callService 注册了三次。因此,一种解决方案是从 Poster 分派事件。Config.evt_SAVEPOSTER_READYEvenDispatcherdb

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);
}

于 2009-12-02T19:51:29.717 回答
0

您是否检查过仅循环遍历一项时会发生什么?在我看来,你没有正确地排队你的例程。

您可能只想向 Main.db 对象添加一次事件侦听器,并在成功保存所有“海报”后将其删除。

于 2009-12-02T18:57:04.333 回答
0

db call ( Main.db.savePoster();) 是否同步 - 它仅在操作完成后返回?由于您addEventListener在 db 调用之后调用,因此如果 db-call 是同步的,则不会调用事件侦听器(至少对于第一次迭代)。

Main.db在所有三个迭代中是相同的实例吗?如果是这样,您不必为它注册相同的事件侦听器三次 - 一次就足够了。addEventListener在开始 for 循环之前调用。保留一个计数器来跟踪对 callService 的调用次数,并removeEventListener在计数器达到循环计数(在本例中为 3)时调用。

于 2009-12-03T04:56:05.377 回答