将加载的数据作为函数的返回值

时间:2013-04-09 10:55:56

标签: actionscript-3 loaddata

我仍然无法理解AS3中的一些简单事情是如何变得更难的。在这里,我想在一个函数中加载一个Bitmap,并在Complete上返回它的值,让app继续。 这样的东西很容易使用:

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()的末尾。我真的不明白我该怎么做才能让我的代码得到优化和工作。我第一次尝试使用像“_Count:int”和“_CountEnd”这样的“loopingLoad”方法来知道何时停止调用loadFile ......好吧,它工作得很好但是真的很难看。所以,我想知道如何简单地用“For”加载几个文件。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

你基本上想要同步加载。不,你不能直接这样做,你必须执行一个变通方法来向其他地方提供一个加载的位图。但是,这将使您重新考虑整个应用程序逻辑,至少是您希望加载图像的部分。

为了使用for循环加载多个文件,您需要执行以下操作:首先,创建一个Loaders数组,每个数组都有一个附加的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
}