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

コードは非同期で実行されます。コールバック(タイムラインのスコープ)の外側で配列をトレースする場合、配列はロードされたXMLデータで更新されていません。相互に呼び出すメソッドを使用して、制御フローを実装する必要があります。タイムラインコードのステートメントは、起動後に同期的に実行されます。

于 2012-12-24T18:41:20.757 に答える
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 に答える
0

XMLに問題があると思います。コードはOKです。

この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 に答える