Actionscript 3 AS3异步问题

Actionscript 3 AS3异步问题,actionscript-3,events,Actionscript 3,Events,我的程序中有一个奇怪的bug,幸运的是我很快就发现了,但我仍然不明白它为什么会发生。本质上,它与源代码和事件侦听器中命令的顺序有关,下面是一个示例: function detectFaces(loader:ImageLoader) { var detector:FaceDetector=new FaceDetector(); detector.addEventListener(FaceDetectorEvent.FACE_CROPPED,facesDetected); detector.load

我的程序中有一个奇怪的bug,幸运的是我很快就发现了,但我仍然不明白它为什么会发生。本质上,它与源代码和事件侦听器中命令的顺序有关,下面是一个示例:

function detectFaces(loader:ImageLoader)
{
var detector:FaceDetector=new FaceDetector();
detector.addEventListener(FaceDetectorEvent.FACE_CROPPED,facesDetected);
detector.loadFaceImageFromBitmap(loader.bitmap);
var something:Number = stage.width;

    function facesDetected(e:FaceDetectorEvent):void{
          trace(something); 
    }
}
在这里引发事件的操作并不重要,唯一需要注意的是大约需要100毫秒。作为跟踪输出,我得到的是NaN,我不知道这是为什么,因为声明变量的行肯定会在facesDetected回调之前调用,并且它在它下面声明的处理函数的范围内。这个问题很容易解决,只需移动一些东西:Number=stage.width;在加载FaceImageFromBitmap(..)方法之前,我想知道为什么会发生这种情况? 我怀疑这不是由于执行顺序,而是与passingByValue和PassingByReference的遵从性有关,但不知道这些会如何导致这样的错误

编辑:现在我更困惑了。。。本规范以任何声明顺序工作:

timers();
function timers()
{
var timerTest:Timer = new Timer(100,1);
timerTest.addEventListener(TimerEvent.TIMER,onTime);
//BEFORE DECLARATION
    timerTest.start();
var something:Number = stage.width;

function onTime(e:Event)
{
    trace("SOMETHING :"+something);
}
}





timers();
function timers()
{
 var timerTest:Timer = new Timer(100,1);
 timerTest.addEventListener(TimerEvent.TIMER,onTime);

 var something:Number = stage.width;
 //AFTER  DECLARATION
 timerTest.start();
 function onTime(e:Event)
 {
    trace("SOMETHING :"+something);
 }
}

函数
loadFaceImageFromBitmap
的代码以同步方式运行。在该函数内部调用
FaceDetectorEvent.FACE\u crapped
事件侦听器,它不是声明在返回ie响应(http请求)后运行的回调


计时器的情况下,它会按预期工作,因为事件侦听器没有在开始时刻正确调用,它会等待X时间。

关于您的初始问题,actionscript将在继续执行后续行之前完成代码块的执行。如果loadFaceImageFromBitmap方法中没有发生任何异步事件(即,如果您没有使用加载器或其他必须等待事件触发的对象),则无论代码执行多长时间,在将“某物”设置为值之前,FACE\u裁剪事件仍将触发


至于另一个问题,在我看来答案很简单,您使用的是TimerEvent-Actionscript,它会承认不应该等到事件触发后再继续执行代码;因此,它将在100毫秒过去之前声明“某物”。因此,在本例中,由于您使用的是事件,因此代码将继续“读取”并执行事件侦听器后面的行。

感谢您的响应。我想我现在明白了。问题是事件是以同步方式触发的,因此在设置变量之前将调用函数。我没有编写这个检测函数,我使用的是一个库,我认为它的工作原理与loader complete或类似。我说代码在detector.loadFaceImageFromBitmap(位图)执行时被冻结了,对吗?正如您所说,这取决于“loadFace…”中是否有任何异步事件发生。如果不是,那么是的,actionscript将在执行该函数中的所有代码时有效地“等待”,然后继续下一行。现在一切都清楚了,谢谢。我想我学到了更好的方法,不要仅仅因为监听器的存在就假设代码是异步的。这确实为我指明了正确的方向,所以谢谢。你得到了我的赞成票,但被接受的答案更详细。