2010-02-27 67 views
2

處理資料時,我總是寫如下:在Actionscript 3.0中結合URLRequest,URLLoader和完整的事件監聽器?

var dataSourceRequest:URLRequest = new URLRequest("/path/file.xml"); 
var dataSourceLoader:URLLoader = new URLLoader(dataSourceRequest); 
dataSourceLoader.addEventListener(Event.COMPLETE, handleDataSource); 

我能夠理解這兩個對象的實用性和事件監聽器是分開,因爲他們經常互相合作,我想知道如果有一種方法將它們全部結合起來?最接近我能得到的是這樣的,但它是一個有點無意義/嵌套:

var dataSourceLoader:URLLoader = new URLLoader(new URLRequest("/path/file.xml")); 
dataSourceLoader.addEventListener(Event.COMPLETE, handleDataSource); 

什麼,我真的很喜歡將東西自動結合的URLRequest,URLLoader和完成的事件監聽器是這樣的:

var dataSource:Whatever = new Whatever("/path/file.xml", handleDataSource); 

回答

3

不......這是Adobe做出的一個建築決策,也是一個很好的決定。兩個班會做很不同的工作,並做好這些工作。事件監聽器允許您多次處理完整的事件,因此在這種情況下比回調更靈活。

然而,您可以創建一個包裝所有功能的類,並以您想要的方式工作!

+0

大多是我可以理解爲什麼事件偵聽器應該保持獨立,但我有困難的時候試圖想象沒有URLLoader的URLRequest(副/反之),所以我有點好奇爲什麼沒有內置的選項,至少將這兩者結合起來。就像寫「新」一樣,我假設它和其他語言一樣,既分配內存又啓動對象。 – TheDarkIn1978 2010-02-27 19:50:51

+1

URLRequest可以捕獲的不僅僅是一個URL,這就是爲什麼它是自己的對象。而且是的URLLoader確實需要URLRequest。但是,那麼類似Loader和Sound的課程也是如此。所以你可以看到URLRequest在多個地方使用,這是另一個好地方。讓它們分開讓我們的開發人員有更多的靈活性,並且在那裏,所以我們可以像你提到的自定義加載器一樣創建對象。 – 2010-02-27 20:00:21

4

將代碼封裝到您自己的類中。這可能是如此簡單:

package 
{ 
    import flash.events.Event; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 

    public class EncapsulatedURLLoader 
    { 
     protected var _callback:Function; 

     public function EncapsulatedURLLoader(dataUrl:String, callback:Function) 
     { 
      _callback = callback; 
      var l:URLLoader = new URLLoader(); 
      l.addEventListener(Event.COMPLETE, onComplete); 
      l.load(new URLRequest(dataUrl)); 
     } 

     private function onComplete(event:Event):void 
     { 
      event.target.removeEventListener(Event.COMPLETE, onComplete); 
      _callback.call(null, event.target.data); 
     } 
    } 
} 

使用它,像這樣:

function onLoaded(data:*):void 
{ 
    trace(data); 
} 

var l:EncapsulatedURLLoader = new EncapsulatedURLLoader("xml/data.xml", onLoaded);