Flash AS3不在函数外返回数组

时间:2012-12-24 17:48:54

标签: xml actionscript-3 flash

我遇到了AS3的一些问题。从XML成功拉出一个数组,但在函数之外没有“已保存”的数组。跟踪数组内部,该功能正常。

如果有人能伸出援助之手,那就太棒了 - 谢谢!

圣诞快乐!

AS3

var mapLocations:Array = new Array();

var xmlLoader:URLLoader = new URLLoader();
xmlLoader.addEventListener(Event.COMPLETE, showXML);
xmlLoader.load(new URLRequest("mapLocations.xml"));
function showXML(e:Event){
    XML.ignoreWhitespace = true; 
    var xml:XML = new XML(e.target.data);
    for (i=0; i<xml.loc.length(); i++) {
        mapLocations.push([
                       xml[0].loc[i].locname,
                       xml[0].loc[i].locx,
                       xml[0].loc[i].locy
                     ]);
    }
    trace(mapLocations); // NOT BEING RETURNED OUTSIDE FUNCTION!
}

3 个答案:

答案 0 :(得分:1)

代码以异步方式执行。当您在回调之外跟踪数组(时间轴的范围)时,数组尚未使用加载的XML数据进行更新。您必须使用相互调用的方法来实现控制流。时间轴代码中的语句在启动后同步执行。

答案 1 :(得分:1)

因为您要求举例:

package examples
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class XMLLoadingExample extends Sprite
    {
        public function XMLLoadingExample()
        {
            super();
            loadLocations();
        }

        private function loadLocations():void
        {
            var xmlLoader:URLLoader = new URLLoader();
            xmlLoader.addEventListener(
                Event.COMPLETE, locationsLoadHandler);
            xmlLoader.load(new URLRequest("mapLocations.xml"));
        }

        // This code handles the initial reception of XML
        // and passes it further for more processing
        private function locationsLoadHandler(event:Event):void
        {
            XML.ignoreWhitespace = true; 
            var xml:XML = XML(event.target.data);
            var result:Array = [];
            for each (var node:XML in xml.loc)
                result.push(node.locname, node.locx, node.locy);
            // Call some other code that waits for the
            // results of loading this XML file
            handleMapLocations(result);
        }

        private function handleMapLocations(locations:Array):void
        {
            // Do whatever you wanted with your location data here
        }
    }
}

答案 2 :(得分:0)

我认为你的XML存在问题。代码没问题。

试试这个XML:

<root>
    <loc>
        <locname>object 1</locname>
        <locx>10</locx>
        <locy>100</locy>
    </loc>
    <loc>
        <locname>object 2</locname>
        <locx>20</locx>
        <locy>200</locy>
    </loc>
    <loc>
        <locname>object 3</locname>
        <locx>30</locx>
        <locy>300</locy>
    </loc>
</root>

您也可以尝试使用此XML:

<root>
    <loc name="object 1" x="10" y="100" />
    <loc name="object 2" x="20" y="200" />
    <loc name="object 3" x="30" y="300" />
</root>

和修改后的代码:

...
mapLocations.push([
    xml[0].loc[i].@name,
    xml[0].loc[i].@x,
    xml[0].loc[i].@y
]);
...