Сделать возврат родительской функции в ActionScript3? (или верните addEventListener) - PullRequest
0 голосов
/ 21 августа 2009

В основном у меня есть код, который должен загружать много изображений, поэтому мне нужна функция для их загрузки. Проблема в том, что addEventListener требует функцию, которую он будет вызывать при возникновении события.

Мне нужно найти способ заставить функцию loadImage возвращать ONLY после возникновения события, или заставить функцию вызываться в addEventListener для возврата ее родительской функции.

    function loadImage(imagePath:String)//:BitmapData
    {
            var internalLoader:Loader = new Loader();

            var internalImageRequest = new URLRequest(imagePath); 

            var loadingComplete:Boolean = false;

            internalLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
                                                              function (event:Event):void
                                                              {
                                                                loadingComplete = true;
                                                              }
                                                              );
            internalLoader.load(internalImageRequest);



            //I need to wait 'till the event have been raised and then RETURN , NOT BEFORE THAT
            //var tempImg:Bitmap = Bitmap(internalLoader.content);
            //return tempImg.bitmapData;
    }

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 21 августа 2009

Краткий ответ: Брось, этого не произойдет.

Длинный ответ: Дело в том, что вы никогда не хотите, чтобы Flash Player зависал. Причин для этого много, но все сводится к тому, что вы всегда работаете в потоке пользовательского интерфейса. Сетевой запрос, такой как ваш, будет означать, что вам придется ждать загрузки изображения, что приведет к зависанию интерфейса во время ожидания и, следовательно, раздражает пользователя. Если изображение маленькое и эффективность сети не является проблемой, то это не проблема для вас. Однако, если загрузка изображения занимает некоторое время, проблема поднимает голову. Кроме того, Flash Player накладывает ограничение на время выполнения кода на кадр, 15 секунд, если я правильно помню. После этого пользователь получает всплывающее окно с вопросом, следует ли прервать выполнение сценария.

Вместо этого я предлагаю определить обработчик событий, который делает все, что вам нужно, с объектом BitmapData, который вы получаете из загрузчика.

function loadImage(imagePath:String):void
{
    var internalLoader:Loader = new Loader();
    var internalImageRequest = new URLRequest(imagePath); 

    var loadingComplete:Boolean = false;

    internalLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
    internalLoader.load(internalImageRequest);
}

function onLoad(event:Event):void
{
    // Do whatever you need to do with the loader here
    var contentLoaderInfo:LoaderInfo = LoaderInfo(event.target);
}
0 голосов
/ 12 ноября 2009

Вы также можете попробовать продолжить передачу стиля:

function loadImage(path:String, result:Function):void {
    var l:Loader = new Loader();
    l.load(new URLRequest(path));
    l.contentLoaderInfo.addEventListener(Event.COMPLETE, function(event:Event):void {
        result(Bitmap(l.content).bitmapData);
    });
    // If you want to handle IO errors, otherwise this effectively never "returns".
    l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(event:Event):void {
        result(null);
    });
}

function process(path:String):void {
    loadImage(path, function(data:BitmapData):void {
        ...
    }
}

Это становится очень болезненным, когда вам приходится объединять несколько функций в цепочку, поэтому вы можете нарушить стандартное форматирование:

function process(path:String):void {
    loadImage(path, function(
    data:BitmapData):void { // Async "result declaration"

    longProcessing(data, function(
    result:ProcessingResult):void {

    // Can use data and result here...
}}} // Have to close continuations as well as process
0 голосов
/ 21 августа 2009

К сожалению, это невозможно. Вам нужно событие, которое регистрирует ваша родительская функция. Затем, когда загрузчик заканчивает загрузку, он вызывает событие. Вы можете передавать свои растровые данные в eventargs.

е

function (event:Event):void 
{
    loadingComplete = true;
    dispatchEvent([Your Event]);
}

Ваш родитель должен слушать [Ваше событие] и делать все, что ему нужно.

...