AS3异步故障

时间:2011-11-23 02:01:40

标签: flash actionscript-3

我正在尝试遍历数组,然后在我这样做时填充另一个数组。但是,我放入新数组的对象需要一些时间来计算。这给了我一些安排上的麻烦。我创建了一个自定义事件来解释该计算的完成并尝试将其包含到我的循环中,但是,即使循环的第一次迭代完成,循环之后的函数仍然会触发。反正有没有听完循环的完成?这是我的代码。

package  {

import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Sprite;
import ImageSplitter;
import SplitEvent;
import Displayer;

public class DocumentClass extends MovieClip {

    private var _splitter:ImageSplitter;
    private var _imageParts:Array;
    private var _stageHeight:Number;
    private var _imgArray:Array;
    private var _bannerArray:Array = [];
    private var _displayer:Displayer;

    public function DocumentClass() {
        _stageHeight = stage.stageHeight;
        _imgArray = ["banners/banner1.jpg", "banners/banner2.jpg"];
        for (var i = 0; i < _imgArray.length; i++) {
            _splitter = new ImageSplitter(_imgArray[i]);
            _splitter.addEventListener(SplitEvent.SPLIT_COMPLETE, onSplit);
            function onSplit(e:SplitEvent):void {
                trace(e);
                _imageParts = _splitter.imageParts;
                _bannerArray.push(_imageParts);
                trace("Banner len: " + _bannerArray.length);
                _splitter.removeEventListener(SplitEvent.SPLIT_COMPLETE, onSplit);
            }
        }
        afterLoop();
    }



    private function afterLoop() {
        trace("loop finished. Banner len: " + _bannerArray.length);
    }
}   

就像我上面所说,afterLoop()在for循环的一次迭代完成之前触发。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

更简单的方法是在新变量(在同一范围内)中跟踪_imgArray中的项目总数,并在每次启动onSplit时减少它。一旦它达到0,你的循环就完成了,你可以调用afterLoop:

public function DocumentClass() {
    _stageHeight = stage.stageHeight;
    _imgArray = ["banners/banner1.jpg", "banners/banner2.jpg"];
    var numImages = _imgArray.length;
    for (var i = 0; i < _imgArray.length; i++) {
        _splitter = new ImageSplitter(_imgArray[i]);
        _splitter.addEventListener(SplitEvent.SPLIT_COMPLETE, onSplit);
        function onSplit(e:SplitEvent):void {
            trace(e);
            _imageParts = _splitter.imageParts;
            _bannerArray.push(_imageParts);
            trace("Banner len: " + _bannerArray.length);
            _splitter.removeEventListener(SplitEvent.SPLIT_COMPLETE, onSplit);
            numImages--; 
            if (numImages == 0) afterLoop();
        }
    }
    //afterLoop();
}



private function afterLoop() {
    trace("loop finished. Banner len: " + _bannerArray.length);
}