AS3 асинхронные проблемы - PullRequest
1 голос
/ 23 ноября 2011

Я пытаюсь перебрать массив, а затем заполнить другой массив.Однако объекты, которые я помещаю в новый массив, требуют некоторого времени для расчета.Это дает мне некоторые головные боли планирования.Я создал пользовательское событие для учета завершения этих вычислений и попытался включить его в свой цикл, однако функция после цикла все еще запускается до завершения даже первой итерации цикла.Есть ли возможность прослушать завершение цикла?Вот мой код

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 Ответ

1 голос
/ 23 ноября 2011

Более простой способ сделать это - отслеживать общее количество элементов в _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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...