Actionscript 3 这是使用返回数据实现回调的有效方法吗?
我需要一个简单的实用程序类,可以处理加载一个AIR桌面项目的XML,并想知道这种方法是否有效,或者是否有更好的方法来做到这一点。下面的完整代码-示例使用的是文本而不是xml 此类使用以下参数从另一个对象接收请求:Actionscript 3 这是使用返回数据实现回调的有效方法吗?,actionscript-3,actionscript,air,Actionscript 3,Actionscript,Air,我需要一个简单的实用程序类,可以处理加载一个AIR桌面项目的XML,并想知道这种方法是否有效,或者是否有更好的方法来做到这一点。下面的完整代码-示例使用的是文本而不是xml 此类使用以下参数从另一个对象接收请求: public function loadTextFile(filename:String, directory:File,
public function loadTextFile(filename:String,
directory:File,
call:Function):void
完成任务后,该类将结果打包到对象实例中,并调用回调函数
var obj:Object = getResultObject(true, "text", fileContents);
callback(obj);
我特别想知道以这种方式使用对象在运行时设置属性是否有效/受支持
我需要它的原因与此无关,但这是因为我继承了一个项目,其中a.有20多个类,每个类都使用URLRequest以自己的方式加载XML,B.每个类都假设XML文件与应用程序目录相关
在我们开始之前:函数不同于函数。函数是编译函数的OO表示,函数可以使用其引用名直接调用,而函数不能。注意故意使用大写来表示两者之间的差异
如果您改变了处理函数对象的方式,那么您当前的实现将起作用。不能像调用使用function.apply方法所需的常规函数那样调用由function对象表示的函数
apply方法接受两个参数,第一个是要操作的对象,如果传递null,它将使用与函数关联的默认对象,第二个是要传递给根函数的参数数组。这就是标准EventDispatcher.addEventListener和callLater架构在幕后的工作方式嘿-谢谢!我从一个类实例传入一个函数,所以我认为它是一个绑定方法,所以我调用它:callbackobj正在工作。我想你指的是传递函数字符串名,是吗?使用callback.applynull[obj];如果有多个类具有相同名称的函数,则为空目标,这不会导致冲突吗?或者,如果我传入一个带有回调函数名的对象ref,我的实用程序类将需要导入被调用方类以存储ref,或者我可以将其作为实例存储为“object”?哦,像这样打包对象类很酷吗?动态定义属性?它与我使用过的其他语言非常不同。除非它实际上是一个函数,否则回调将无法工作。似乎您将call的引用分配给callback,call是一个函数,需要apply方法。我遇到的大多数语言都允许您使用[…]创建包含内容的数组
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;
}
var callback:Function = call;
var theFile:File = directory.resolvePath(filename);
if (! theFile.exists){
var obj:Object = getResultObject(false, "text");
callback.apply(null,[obj]);
}