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

Я до сих пор не могу понять, как некоторые простые вещи становятся сложнее в 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... Ну, это работало хорошо, но это было действительно уродливо. Итак, я хотел бы знать, как просто загрузить несколько файлов с помощью «Для».

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


person Inexo    schedule 09.04.2013    source источник


Ответы (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
}
person Vesper    schedule 09.04.2013
comment
Спасибо. Я впервые читаю о notifyApplication и loaders.indexOf(). Кажется полезным, но мне придется попробовать это несколько раз, чтобы понять, как это использовать. Я действительно не понимаю, если (i‹0) return; тоже, но я думаю, что мне нужно попробовать этот код, чтобы получить его. Большое спасибо за твою помощь. Я не могу найти объяснение notifyApplication в Интернете, возможно, вы могли бы мне это объяснить. - person Inexo; 09.04.2013
comment
notifyApplication() — это заполнитель, на его место вы помещаете любой код, который вам нужен. indexOf() необходим, если вы создаете слайд-шоу или другую вещь, где порядок имеет значение, поэтому, если, скажем, 5-й файл завершит загрузку первым, он не будет отображаться как первый, если вы правильно обработаете индексы. - person Vesper; 09.04.2013
comment
Большое спасибо, я понял. Это хороший способ, я не знал, что можно завершить функцию, возвращающую пустоту. - person Inexo; 09.04.2013