Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash AS3中的竞赛条件激发事件_Flash_Actionscript 3_Events_Race Condition - Fatal编程技术网

Flash AS3中的竞赛条件激发事件

Flash AS3中的竞赛条件激发事件,flash,actionscript-3,events,race-condition,Flash,Actionscript 3,Events,Race Condition,我在按正确的编年史顺序触发和删除事件时遇到一些问题。下面的代码给出了以下输出: 将海报保存到db中,并发送事件 调用服务,已删除分派事件=false 调用服务,已删除分派事件=false 调用服务,已删除分派事件=true 将海报保存到db中,并发送事件 将海报保存到db中,并发送事件 当然,这应该更像是: 将海报保存到db中,并发送事件 调用服务,已删除分派事件=true 将海报保存到db中,并发送事件 调用服务,已删除分派事件=true 将海报保存到db中,并发送事件 调用服务,已删除

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

  • 将海报保存到db中,并发送事件
  • 调用服务,已删除分派事件=false
  • 调用服务,已删除分派事件=false
  • 调用服务,已删除分派事件=true
  • 将海报保存到db中,并发送事件
  • 将海报保存到db中,并发送事件
当然,这应该更像是:

  • 将海报保存到db中,并发送事件
  • 调用服务,已删除分派事件=true
  • 将海报保存到db中,并发送事件
  • 调用服务,已删除分派事件=true
  • 将海报保存到db中,并发送事件
  • 调用服务,已删除分派事件=true
有人能帮我吗?我已经没有办法解决这个问题了

谢谢

for(变量i:int=0;i<3;i++){
createPoster();
}
函数createPoster(){
Main.db.savePoster();
Main.db.addEventListener(Config.evt_SAVEPOSTER_READY,callService);
}
函数callService(){
Main.db.removeEventListener(Config.evt_SAVEPOSTER_READY,callService);
}

您是否检查了仅循环一项时会发生什么情况?在我看来,你没有把你的日常工作排好队


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

您是否检查了仅循环一项时会发生什么情况?在我看来,你没有把你的日常工作排好队


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

问题在于,您正在为单个
evendDispatcher
对象
db
上的同一事件
Config.evt\u SAVEPOSTER\u READY
注册相同的函数
callService
。因此,在成功保存海报后,第一个savePoster发送事件时,db收到事件并调用三个EventHandler(在本例中为callService),因为callService已注册三次。因此,一种解决方案是从Poster中调度事件。
for(var i:int=0;i<3;i++){
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);
}
createPoster(); } 函数createPoster(){ poster=Main.db.savePoster(); poster.addEventListener(Config.evt_SAVEPOSTER_READY,callService); } 函数调用服务(e:PostereEvent){ e、 removeEventListener(Config.evt_SAVEPOSTER_READY,callService);
}

问题在于,您正在为同一事件
Config.evt\u SAVEPOSTER\u READY
在单个
evendDispatcher
对象
db
上注册相同的函数
callService
。因此,在成功保存海报后,第一个savePoster发送事件时,db收到事件并调用三个EventHandler(在本例中为callService),因为callService已注册三次。因此,一种解决方案是从Poster中调度事件。
for(var i:int=0;i<3;i++){
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);
}
createPoster(); } 函数createPoster(){ poster=Main.db.savePoster(); poster.addEventListener(Config.evt_SAVEPOSTER_READY,callService); } 函数调用服务(e:PostereEvent){ e、 removeEventListener(Config.evt_SAVEPOSTER_READY,callService); }

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

在所有三次迭代中,
Main.db
是同一个实例吗?如果是,您不必三次注册同一事件侦听器,一次就足够了。在启动for循环之前调用
addEventListener
。保留一个计数器,用于跟踪调用服务的调用次数,并在计数器达到循环计数(本例中为3)后调用
removeEventListener

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


在所有三次迭代中,
Main.db
是同一个实例吗?如果是,您不必三次注册同一事件侦听器,一次就足够了。在启动for循环之前调用
addEventListener
。保留一个计数器,用于跟踪呼叫服务的呼叫数,并在计数器点击循环计数(本例中为3)后调用
removeEventListener

嘿,谢谢回复。是的,循环一次没有问题。我在for循环中放置了一个计时器,如果我每1000毫秒触发一次createPoster,那么就没有问题了。对于能够删除的事件来说,for循环似乎将变得很快。添加延迟来解决问题是一个薄弱的策略。稍后我可能会发布一些示例代码来解释我的上述观点。是的,循环一次没有问题。我在for循环中放置了一个计时器,如果我每1000毫秒触发一次createPoster,那么就没有问题了。对于能够删除的事件来说,for循环似乎将变得很快。添加延迟来解决问题是一个薄弱的策略。稍后我可能会发布一些示例代码来解释我上面的观点。我会实现它,然后再回来。谢谢你的回复!嗯,说得好。我会实现它,然后再回来。谢谢你的回复!