考虑一个actionscript程序,这样无论何时下载完成(并且发生完整事件),都会将值推送到数组中。
如果可以同时下载多个,阵列推送功能是否会失败?例如,发生完整事件,初始化推送新值的函数,但在函数终止之前,发生另一个完整事件,并且在第一个完成之前启动第二个推送功能,因此以某种方式弄乱阵列。
会出现这样的问题吗?
答案 0 :(得分:1)
如果您正在使用Array类中的push方法,那么这不是一个问题。
如果您正在编辑自己的数组类&以某种奇怪的方式实现推送方法,那么你可能会担心它。
答案 1 :(得分:1)
不,你在Flash中描述的内容是不可能的。 Flash完全是单线程的,除非你使用Worker
(如果你是,你应该知道你的问题的答案)。这意味着Flash一次不能执行多个操作(“线程”是指可以执行代码的处理器的一部分的术语。通常,每个CPU核心为1-2个)。即使有异步事件,它也必须等到执行中有差距才能分派,其他代码才能运行。因此,基本上,Flash不可能同时触发两个事件或同时运行任何两个进程。
为了解决你问题中的另一个问题,一行代码的执行永远不会中断。那么让我们来看看这段代码:
var l:URLLoader = new URLLoader();
l.addEventListener(Event.COMPLETE, completeHandler);
l.load(new URLRequest("http://google.com"));
for (var i:uint = 0; i < 1000000; i++) {
trace("let's mess with the console");
}
function completeHandler(e:Event):void {
trace("complete");
}
所以我们有一个异步加载的谷歌,这应该很快。但是,在循环开始之前(在微秒范围内),它不会足够快。但是,这并不重要,因为事件在循环结束之前无法发送。因此,假设调试器/ IDE没有崩溃,因为有一百万个日志涌入(字面意思),那个COMPLETE
事件将出现在控制台的最后,100万“让我们搞砸了控制台“消息。该循环可能需要30秒,并且该负载可能需要120ms。没关系。没有什么可以阻止这个循环完成,没有任何事情可以发生,直到它完成。
所以,换句话说,当执行开放时事件会触发。正如Marty所说,Event系统的行为就像一个队列。当执行中存在差距时,它将发送一个事件。当存在另一个缺口时,请记住,前一个事件的侦听器处理程序中的代码必须在该间隙发生之前完成,然后触发下一个事件。