2011-03-19 43 views
0

我试图检索XML文件从互联网上,分析它,并从它使用ActionScript 3.0一个函数返回一个值,所有返回已解析的XML值。在Actionscript中

这里是我的代码:

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

var text:String = function onXMLLoaded ......想法是行不通的,因为那是什么语句做的是分配onXMLLoaded函数本身(Function类型)的text变量String型的,这就是为什么它不会编译。

长话短说,没有简单的方法可以在Actionscript中对外部源(例如XML,Web服务)进行同步调用。对于来自典型的C/Java类型开发环境的人来说,这是非常令人愤慨的,其中包括我自己。很多在C语言中很常见的典型设计模式在Actionscript中是不可能的。你将永远无法从同一个函数返回URLLoader调用的结果;这就是语言的构建方式。解决此

一种方法是在参数的函数来传递,并创建一个匿名函数,在对象上设置一个值包含文本,像这样:

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);和一段时间后someObject.text将等于你的XML调用的结果。

关键词是它在之后的某段时间。因为它是一个异步调用(即使它是本地XML文件),你永远无法确切地知道什么时候该呼叫结束。如果你尝试做​​你很可能会得到一个错误,因为跟踪语句运行时调用将无法完成。

希望这取得了一定的意义。了解AS3的异步架构是一个很难的主题,也是非常重要的。但是,总而言之:许多人已经尝试了很长时间,很难将同步呼叫适用于AS3,并且他们都被疯狂地驱使。所以,不要这样做。