单线程的AS3是如何处理异步事件的

时间:2022-03-03 09:45:29

AS3是单线程执行代码。包括事件的响应执行也是单线程的。但它可以调用宿主的多线程,产生一些异步事件。比如load。

现在不清楚的是,如果是单线程,当load请求返回来之时,AS3正在执行当前的语句系列,那是否会在当前插入响应语句,还是会等当前代码执行完成之后再响应语句。
比如当load请求回来之时,我的for(i=0;i<1000000000000000;i++){...}正在for到i=50000000,如果这时响应load请求,是否会先挂起当前的for语句,去响应完load之后再回来,还是会先for完全部再去执行响应。再如果,这时load的响应语句里,将i重置为0,是否会引响到当前for的执行呢?

import flash.utils.setTimeout;
import flash.utils.setInterval;

private var i:uint = 0;
private function init():void{
setTimeout(addEvent,1000);
}
private function addEvent():void{
stage.frameRate = 1;
stage.addEventListener(Event.ENTER_FRAME,enterFrame);
setTimeout(loop,1);
var s:String="";
for(var k:uint=0;k<555555;k++){
s += "afdsffsfdsafdsfsdfdsfdsf";
trace("+++++"+ k + "+++++++");
}
}
private function loop():void{
trace("=====");
}
private function enterFrame(event:Event):void{
i++;
trace(i);
}

做了一个测试,得出两个结论:
1.当AS要跳到下一帧时,会先检查当前所有代码是否都已经执行完。如果没有执行完,会强行的延长帧的时间。
2.异步处理并不是基于帧的轮巡,一个侦里可以执行多次定时器,但是会等待当前代码执行告一段落之后才被执行。而当前代码段,最长为一个帧,最短则不限。