2009-08-21 66 views
0

基本上我有一個代碼應該加載大量的圖像,所以我需要一個函數來加載它們。問題是addEventListener需要一個函數,當事件發生時它會調用它。在ActionScript3中使父函數返回? (或使addEventListener返回)

我需要找到一種方法,在事件發生後使loadImage函數返回僅返回,或者使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; 
    } 

在此先感謝

回答

2

簡短的回答:放棄它,它不會發生這樣的。

長答案:這裏的事情是,你永遠不想Flash Player掛起。原因很多,但歸根結底就是你總是在UI線程中操作。像你這樣的網絡請求意味着你必須等待圖像加載,這會在等待時掛起UI,從而煩人用戶。如果圖像很小,網絡效率不是問題,那麼這對您來說不是問題。但是,如果圖像需要一段時間才能加載問題,那麼它就是頭。另外,如果我正確記得,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

不幸的是,這是不可能的。您需要您的父功能註冊的事件。然後當裝載機完成裝載時,它會引發事件。你可以在eventargs中傳遞你的位圖數據。

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

你的父母需要聽取[你的活動],而且無論它的需要。

0

您也可以嘗試繼續傳球方式:

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