【发布时间】:2009-04-25 07:25:57
【问题描述】:
我正在创建一个动作脚本库。我正在调用一些 API 来解析一些 xml 并得到结果。解析完成后,它会分派一个 Event.COMPLETE。我想监视此事件是否在诸如“while(eventnotdispatched)”之类的某个while循环中分派 是否可以?我知道另一种方法是添加事件监听器。但是如果其他事情是可能的,请告诉我。
谢谢
【问题讨论】:
标签: actionscript
我正在创建一个动作脚本库。我正在调用一些 API 来解析一些 xml 并得到结果。解析完成后,它会分派一个 Event.COMPLETE。我想监视此事件是否在诸如“while(eventnotdispatched)”之类的某个while循环中分派 是否可以?我知道另一种方法是添加事件监听器。但是如果其他事情是可能的,请告诉我。
谢谢
【问题讨论】:
标签: actionscript
不,这是不可能的。 Actionscript 是单线程的。因此,当您在 while 循环中等待时,这是唯一正在运行的线程,而您正在等待的进程永远无法完成。这就是为什么一切都通过事件完成的原因,所以这就是你应该使用的。如果您在等待某事完成时需要定期更新您的显示...再次使用事件。创建一个 Timer 对象,该对象每隔一段时间生成一个 TIMER 事件,并使用它来进行更新。
【讨论】:
编辑:Davr 是对的,你不能像这样使用 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 是一种事件驱动语言。您绝对没有理由需要这样做。无论您尝试做什么,都可以使用另一种更简单的方法来完成。告诉我你想用这个来完成什么,我会提出一个更好的解决方案。
抱歉吵了,时间不早了,我困了。
【讨论】:
这样做意味着在底层异步模型(与回调一起使用)上强制执行同步模型。
你到底想达到什么目的,为什么不使用回调?
【讨论】:
我同意关于这可能是一个坏主意的说法,while 循环肯定不会在 ActionScript 中以这种方式工作。但是,您可能有正当理由去做您正在尝试做的事情。只有你可以防止坏代码。我不会评判,而是会回答您的问题。
首先我要做一个假设,即您真正想要做的是监视一个属性,并且由于某种原因,该对象的 API 在该属性更改时不会调度事件。我做出这个假设是因为如果您有可用的事件,我假设您只会使用该事件。
所以...你有一个对象 weirdXmlObj,其属性 loaded 默认为 false 但变为 true 加载 XML 时。
在这种情况下,稍微修改一下 CookieOfFortune 发布的代码实际上可以工作。您不需要 loadCompleteEventHandler 函数(无论如何都没有附加),并且在计时器处理程序中您只需检查 if(similarXmlObj.loaded) ,然后根据需要进行分支到。
嗯,但可能有更简单的方法,这取决于你在做什么。 如果你有一个方便的显示对象。 (即有意义的东西,而不仅仅是一些随机对象。)您可以将代码附加到舞台的 EnterFrame 事件,而不是使用计时器。
myDisplayObject.stage.addEventListner(Event.ENTER_FRAME,frameEnterHandler);
需要注意的几点:
您甚至不需要进入舞台级别,所有显示对象都支持 EnterFrame 事件,但它是附加事件侦听器的好地方。
您确实应该将函数调用的内容保持在最低限度。尤其是实际的 frameEnterHandler 函数应该只做 if( WeirdXmlObj.loaded ) 检查。
【讨论】:
您正试图规避事件驱动编程,这不是一个好主意。当有人从较旧的模型接近并且还没有一个好的参考框架来欣赏事件驱动编程的优雅时,通常会出现这种情况。
事件是你的朋友。他们工作得很好。您的 loadCompleteHandler 就是所需要的。想要做点别的回应吗?在该处理程序中添加调用:
private function loadCompletedHandler(event:Event):void
{
waitingObject.fileWasLoadedSoGoDoThatThing();
}
没有必要让它比这更复杂。不需要信号量或循环来检查信号量。不必要的环境信号量可能会破坏封装,从而保护您免受不必要的副作用。
【讨论】: