AS3 XML Loading - 加载函数外部不存在变量

时间:2012-09-14 10:43:51

标签: xml actionscript-3 flash

//Generating menu from XML
var linksXML:XML;
var linksLoader:URLLoader = new URLLoader();
var linksDB:Array = new Array();
linksLoader.load(new URLRequest("menu_links.xml"));
linksLoader.addEventListener(Event.COMPLETE, processXML);
function processXML(evnt:Event):void {
    linksXML = new XML(evnt.target.data);
    for (var i:int = 0; i < linksXML.link.length(); i++){
        var newLink:Array = [linksXML.link[i].@name, linksXML.link[i].@param, linksXML.link[i]];
        linksDB[i] = new Array(newLink);
        trace(linksDB);
    }
}
trace(linksXML.*);

输出

Second trace: 
null
First trace: 
<menu>
  <link name="first" param="true">first.php</link>
  <link name="second" param="true">second.php</link>
  <link name="third" param="true">third.php</link>
</menu>

所以在我看来,当函数退出时,flash会丢失变量。请帮忙!我不知道为什么会发生这种情况

提前致谢!

3 个答案:

答案 0 :(得分:1)

仅当Event.COMPLETE处理程序完成其任务时,XML数据才存储在linksXML变量中,因为as3是异步的。跟踪processXML函数中的linksXML var。

修改

function processXML(e:Event):void{
        .....
        .....
    futureAction();
}
function futureAction():void{
     trace(linksXML);
}

答案 1 :(得分:0)

实际上它确实存在,当你在处理程序之外跟踪它时,它不会被初始化。想象一下代码有点像这样:

  1. 初始化变量
  2. load xml
  3. 为xml loader
  4. 设置加载完成处理程序
  5. trace xml
  6. 我省略了processXML,因为即使你在上面定义它

    trace(linksXML.*);
    

    它并不意味着它被调用,它是一个异步函数,在URLLoader完成加载时被调用。您在加载后立即跟踪xml,因此,在该时间点,xml将不会就绪。

    如果有帮助,试试这个:

    var linksXML:XML;
    var linksLoader:URLLoader = new URLLoader();
    var linksDB:Array = [];
    linksLoader.load(new URLRequest("menu_links.xml"));
    linksLoader.addEventListener(Event.COMPLETE, processXML);
    function processXML(evnt:Event):void {
        linksXML = new XML(evnt.target.data);
        for (var i:int = 0; i < linksXML.link.length(); i++){
            linksDB[i] = [linksXML.link[i].@name, linksXML.link[i].@param, linksXML.link[i]];
            trace(new Date() + " xml parsed: \n"+linksDB);
        }
    }
    addEventListener(Event.ENTER_FRAME,checkXML);
    function checkXML(event:Event):void{
        trace(new Date(),linksXML);
        if(linksXML != null) removeEventListener(Event.ENTER_FRAME,checkXML);
    }
    

    应该可以更容易地看到xml会发生什么。当然,您只需在processXML中触发依赖于该XML的其他操作,您就不需要ENTER_FRAME处理程序,只是为了说明一点。

    简而言之,变量可以在函数外部访问,只是它没有值直到 processXML被调用。在那之后,它已经准备好了。如果它有帮助,请随意使用调试器。

答案 2 :(得分:0)

该帖子的标题表明范围问题。看起来你已经在函数之外定义了数组;但是,我不确定var linksDB:Array = new Array();是否是正确的方法。试试var linksDB:Array = [];

这是我很久以前组装的一个简单的XML加载的东西。内容与你正在做的事情无关,但如果你像我一样,觉得一个有用的例子可能会有用:)

var xmlLoad = new URLLoader(xmlLocation);
xmlLoad.addEventListener(Event.COMPLETE, buildSlider);

function buildSlider(e){

    var adList = new XML(e.target.data);
    numPics = adList.ad.length();

    for(var i in adList.ad){
        var pic = new Pic;
        pic.pic = adList.ad[i].pic;
        pic.clicky = adList.ad[i].clicky;
        pic.init();
        pic.x = picWidth * i;       
        contentHolder.addChild(pic);
    }   
    endChecker();

    // autoplay until end of list, or until user clicks
    autoInterval = setInterval(nextButtClick, 4000);
}

XML:

<?xml version="1.0" encoding="UTF-8"?>
<ads>

    <ad>
        <pic>40-Hinton-Gardens.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>

    <ad>
        <pic>644-Haymarket-Lane.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>

    <ad>
        <pic>756-Cambridge-Lane.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>

    <ad>
        <pic>9809-Charolais-Drive.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>


</ads>

希望这有点帮助:)祝你好运!