2014-10-17 16 views
0

我需要一個簡單的實用程序類,它可以處理加載XML的AIR桌面項目,並希望問這種方法是否有效或是否有更好的方法來做到這一點。 (下面全碼 - 的例子是使用「文本」而不​​是「XML」)這是一個有效的方式來實現回調數據的回調?

這個類接收來自另一對象具有以下PARAMS的請求:

   public function loadTextFile(filename:String, 
             directory:File, 
               call:Function):void 

完成任務後級包的結果在一個Object實例並調用回調函數。

   var obj:Object = getResultObject(true, "text", fileContents); 
       callback(obj); 

我想知道,特別是如果以這種方式使用的Object(飛設置它的屬性是有效的/支持。

(我需要這樣的原因是不相關的,但它是因爲我VE繼承了A.有以自己的方式20+類每個裝載XML項目使用URLRequest,並且每次B.這些類的假設XML文件是相對於應用程序目錄)


  public function loadTextFile(filename:String, 
            directory:File, 
           call:Function):void 
     { 
      callback = call; 
      var theFile:File = directory.resolvePath(filename); 
      if (! theFile.exists){ 
       var obj:Object = getResultObject(false, "text"); 
       callback(obj); 
      } else { 

       var fileStreamObj:FileStream = new FileStream(); 
       fileStreamObj.openAsync(theFile,FileMode.READ); 

       var fileStream:FileStream = new FileStream(); 
       fileStream.addEventListener(Event.COMPLETE, fileComplete); 
       fileStream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 

       fileStream.openAsync(theFile, FileMode.READ); 
      } 
     } 

     private function fileComplete(event : Event):void 
     { 
      var fileStream:FileStream = event.target as FileStream; 
      fileStream.removeEventListener(Event.COMPLETE, fileComplete); 
      fileStream.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 

      var fileContents:String = fileStream.readMultiByte(fileStream.bytesAvailable, ISO_CS); 
      fileStream.close(); 
     } 

     private function ioErrorHandler(event:IOErrorEvent):void 
     { 
      var fileStream:FileStream = event.target as FileStream; 
      fileStream.removeEventListener(Event.COMPLETE, fileComplete); 
      fileStream.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 

      var obj:Object = getResultObject(false, "text"); 
      callback(obj); 
     } 

     private function getResultObject(result:Boolean, type:String, data:*= null):Object 
     { 
      var obj:Object = new Object; 
      obj["result"] = result; 

      switch(type) { 
       case "text": 
        obj["text"] = data; 
        break; 

       default: 

        break; 
      } 
       return obj; 
     } 

回答

0

在我們開始之前:Functionfunction不同。 A Function是遵守的function的OO表示,可以使用它的參考名稱直接調用functionFunction不能。 (注意兩者之間的差異使用大寫字母)

如果您更改了對待Function對象的方式,那麼您當前的實現將起作用。您無法撥打Function對象所代表的function,方法與您需要使用Function.apply()方法的常規function相同。

var callback:Function = call; 
     var theFile:File = directory.resolvePath(filename); 
     if (! theFile.exists){ 
      var obj:Object = getResultObject(false, "text"); 
      callback.apply(null,[obj]); 
     } 

apply()方法接受兩個參數,首先是要操作的對象時,如果傳遞null它使用與Function關聯的缺省對象,第二個是參數數組傳遞到根function 。這是標準的EventDispatcher.addEventListener()callLater()體系結構在幕後以及

+0

嘿,謝謝!我從類實例傳入一個'Function',所以它是一個'Bound Method'(我相信),所以我調用它:'callback(obj)'正在工作。你指的是傳遞函數('String')的名字,我想,是嗎?使用'callback.apply(null,[obj]);'(一個空目標)如果有多個具有相同名稱的'function'的類,會不會導致衝突?或者,如果我傳遞一個帶有回調'函數'名稱的對象ref,我的工具類將需要導入被調用者類來存儲ref - 或者我可以將它作爲一個實例存儲爲'Object'嗎? – 2014-10-17 17:28:30

+0

哦 - 打包Object類是否很酷 - 定義屬性?這與我用過的其他語言非常不同。 – 2014-10-17 17:29:59

+0

您的回調()將不起作用,除非它實際上是一個函數。看起來您將呼叫的參考分配給回叫,並且呼叫是一個功能,需要應用方法 – CyanAngel 2014-10-17 18:11:25

相關問題