我的程序中有一个奇怪的错误,我幸运地发现它很快但仍然感到困惑为什么会发生这种情况。本质上它与源代码和事件监听器中的命令顺序有关,这里是示例:
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,我不知道为什么会这样,因为在声明faceDetected回调之前肯定会调用变量某些东西,并且它在它下面声明的处理函数的范围内。只需移动var就可以轻松解决这个问题:Number = stage.width;在loadFaceImageFromBitmap(..)方法之前,但我真的想知道为什么会发生这种情况? 我怀疑这不是由于执行顺序,而是与passByValue和passingByRefrence deferences有关,但不知道它们会如何导致这样的错误。
编辑:现在我更加困惑......这段代码按照任何声明顺序运作:
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);
}
}
答案 0 :(得分:1)
函数loadFaceImageFromBitmap
的代码以同步方式运行。 FaceDetectorEvent.FACE_CROPPED
事件监听器在该函数内部被调用,它不是在为(http请求)返回一些响应后声明要运行的回调。
如果Timer
按预期工作,因为事件监听器在开始时没有被调用,它会等待X时间。
答案 1 :(得分:1)
关于您的初始问题,actionscript将在继续执行后续行之前完成代码块的执行。如果你的loadFaceImageFromBitmap方法中没有发生任何异步(即,如果你没有使用Loader或其他一些必须等待事件触发的对象)那么,无论代码执行多长时间,FACE_CROPPED事件仍然会在'something'设置为值之前触发。
至于另一个问题,它在我看来答案就是你正在使用TimerEvent - Actionscript将确认它不应该在继续执行代码之前等待事件触发;因此,它将在100毫秒过去之前声明“某事”。因此,在这种情况下,因为您正在使用事件,代码将继续“读取”并执行事件侦听器之后的行。