0

我在使用 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!
}
4

3 回答 3

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
        }
    }
}
于 2012-12-24T19:31:41.187 回答
1

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

于 2012-12-24T18:41:20.757 回答
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
]);
...
于 2012-12-24T18:28:13.217 回答