Получить загруженные данные в качестве возвращаемого значения в функции

Я до сих пор не могу понять, как некоторые простые вещи становятся сложнее в AS3. Здесь я хотел бы загрузить растровое изображение в функцию и при завершении вернуть его значение, чтобы приложение продолжало работу. Нечто подобное будет легко использовать:

var imageLoader:Bitmap;

for (var i:int=0; i<n.length; i++) {
    imageLoader = loadFile(name[i]);
    trace(imageLoader); // [object Bitmap]
}

function loadFile(name:String):Bitmap {
   imgLoad:ImageLoader = new ImageLoader(url + name)
   imgLoad.addEventListener(LoaderEvent.COMPLETE, fileLoaded);
   imgLoad.load;

   function fileLoaded(ev:LoaderEvent) {
      return ev.target.content; // the file now loaded is a bitmap.
   }
}

Но это не работает. Возвращаемое значение должно быть в конце loadFile(). Я не очень понимаю, что мне делать, чтобы мой код был оптимизирован и работал. В первый раз, когда я попытался, я использовал что-то вроде метода "loopingLoad" с "_Count:int" и "_CountEnd", чтобы узнать, когда прекратить вызывать loadFile... Что ж, это работало хорошо, но было очень уродливо. Итак, я хотел бы знать, как просто загрузить несколько файлов с помощью "For".

Спасибо за вашу помощь.

1 ответ

Решение

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

Чтобы загрузить несколько файлов с циклом for, вам нужно сделать следующее: во-первых, вы создаете массив ваших загрузчиков, каждый с прикрепленным Event.COMPLETE слушатель. Во-вторых, ваше приложение должно быть уведомлено о завершении загрузки одним из загрузчиков, указав либо индекс, либо ссылку на контент, либо и то, и другое.

var loaders:Array=new Array();
...
for (var i:int=0;i<urlArray.length;i++) {
    // urlArray is the array with links to bitmaps
    var l:Loader=new Loader();
    l.addEventListener(Event.COMPLETE,onComplete);
    l.load(new URLRequest(urlArray[i]));
    loaders.push(l); // store it, if you want
    // do other stuff, like preparing to accept an image
} // and that's all, you initiate and wait!
...
function onComplete(event:Event):void {
    var i:int=loaders.indexOf(event.target); // get the index
    event.target.removeEventListener(Event.COMPLETE,onComplete);
    if (i<0) return; // oops! 
    notifyApplication(event.target.content); // now you transfer a ready bitmap
    // add "i" if you need that index of your former "for" loop here
}
Другие вопросы по тегам