2011-06-18 30 views
0
private function getTitle(src:String):String{ 
      var urlLoader:URLLoader = new URLLoader(); 
      var rssURLRequest:URLRequest = new URLRequest(src); 
      var rss:XML = new XML; 
      var t:String = src; 
      urlLoader.addEventListener(Event.COMPLETE, 
             function(event:Event):void{ 
              rss = XML(urlLoader.data); 
              t = rss.channel.title.toString(); 
             }); 
      return t; 
     } 

我知道這段代碼不起作用,因爲匿名函數在返回t之後才起作用。我將如何使它可以工作?如何使用addEventListener並返回Actionscript中已更改的內容?

回答

4

您將無法從此方法返回加載的數據。這是因爲加載是異步的,並不會阻止後續代碼的執行。您最好的選擇是將變量移出該函數的範圍,並編寫第二個函數來處理事件COMPLETE

類似下面應該工作:

var rss:XML; 
var t:String; 
var path:String = "some path"; 
var urlLoader:URLLoader = new URLLoader(); 


private function getTitle(src:String):String 
{ 
    urlLoader.load(new URLRequest(src)); 
    urlLoader.addEventListener(Event.COMPLETE, onComplete); 
} 

private function onComplete(event:Event):void 
{ 
    rss = XML(urlLoader.data); 
    t = path + rss.channel.title.toString(); 
} 

我知道這並沒有真正直接回答這個問題,但它是用於處理數據加載的最佳實踐。如果你真的想在數據加載之前停止執行任何代碼,可以在addEventListener行之後使用while循環來停止播放器,直到數據加載。這應該可能被認爲是不太優雅的黑客。

private function getTitle(src:String):String 
{ 
    var urlLoader:URLLoader = new URLLoader(); 
    var rssURLRequest:URLRequest = new URLRequest(src); 
    var rss:XML = new XML; 
    var t:String = src; 
    var complete:Boolean; 
    urlLoader.addEventListener(Event.COMPLETE, 
            function(event:Event):void 
            { 
             rss = XML(urlLoader.data); 
             t = rss.channel.title.toString(); 
             complete = true; 
            }); 
    while(!complete) { /* sleep hack */ } 
    return t; 
} 

我還沒有測試過,但它似乎可以工作。推薦第一個例子。

+0

正如@jeremyne​​albrown指出的那樣,這是一種黑客...如果加載程序因任何原因失敗,將會發生非常糟糕的事情。向事件監聽者添加錯誤並處理這些錯誤是明智的,以便玩家不會在該循環中保持阻塞狀態。 – goliatone

相關問題