我正在尝试从Internet检索XML文件,解析它并从中返回一个值,所有这些都来自使用Actionscript 3.0的一个函数。
这是我的代码:
public function getValue(aWord:String):void
{
var xml:XML;
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE,onXMLLoaded);
urlLoader.load(new URLRequest("SOMEXMLFILE.xml")); // I use the aWord parameter in fetching the xml file
function onXMLLoaded(e:Event):String{
xml = new XML(e.target.data);
trace(xml);
return (xml.bestmatch.dictionary.text());
}
return ""; //THIS NEEDS TO RETURN THE VALUE FOUND IN THE onXMLLoaded FUNCTION
}
理想情况下,可以将本地函数“onXMLLoaded”赋值给变量;例如
var text:String = function onXMLLoaded .....
然后我只返回变量“text”。但是,当我尝试这样做时,编译器会抱怨。如何将onXMLLoaded函数中找到的值返回给getValue函数的调用者?
谢谢!
答案 0 :(得分:0)
您的var text:String = function onXMLLoaded
...提示不起作用,因为该声明正在做的是将onXMLLoaded
函数本身(类型为Function
)分配给text
<{1}}类型的变量,这就是它不能编译的原因。
长话短说,就是在Actionscript中对外部源(例如XML,Web服务)进行同步调用没有简单的方法。对于那些来自典型的C / Java类型开发环境的人来说,这是非常令人生气的,包括我自己。在ActionScript中,很多典型的C语言中常见的设计模式是不可能的。您永远无法从同一函数返回URLLoader调用的结果;这就是语言的构建方式。
解决此问题的一种方法是将参数传递给函数并创建一个匿名函数,该函数在包含文本的对象上设置值,如下所示:
String
然后,您可以使用public function getValue(aWord:String, textToSetObject:Object):void
{
var xml:XML;
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE,
function (e:Event) : void
{
textToSetObject.text = new XML(e.target.data).bestmatch.dictionary.text();
}
);
urlLoader.load(new URLRequest("SOMEXMLFILE.xml"));
}
调用此函数,并在一段时间后getValue("string", someObject);
将等于XML调用的结果。
关键词是它在一段时间之后。由于它是异步调用(即使它是本地XML文件),您将无法确切知道调用何时完成。如果您尝试执行someObject.text
,则很可能会收到错误,因为当trace语句运行时,调用将无法完成。
希望这有点道理。理解AS3的异步架构是一个难题,非常重要。但是,总而言之:许多人已经尝试了很长时间并且难以适应AS3的同步调用,而且他们都被疯狂了。所以,不要这样做。