我需要一個簡單的實用程序類,它可以處理加載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;
}
嘿,謝謝!我從類實例傳入一個'Function',所以它是一個'Bound Method'(我相信),所以我調用它:'callback(obj)'正在工作。你指的是傳遞函數('String')的名字,我想,是嗎?使用'callback.apply(null,[obj]);'(一個空目標)如果有多個具有相同名稱的'function'的類,會不會導致衝突?或者,如果我傳遞一個帶有回調'函數'名稱的對象ref,我的工具類將需要導入被調用者類來存儲ref - 或者我可以將它作爲一個實例存儲爲'Object'嗎? – 2014-10-17 17:28:30
哦 - 打包Object類是否很酷 - 定義屬性?這與我用過的其他語言非常不同。 – 2014-10-17 17:29:59
您的回調()將不起作用,除非它實際上是一個函數。看起來您將呼叫的參考分配給回叫,並且呼叫是一個功能,需要應用方法 – CyanAngel 2014-10-17 18:11:25