为什么我的函数不返回我期望的数据?

时间:2014-07-12 21:32:08

标签: arrays actionscript-3

这是我的代码,从文本文件创建一个数组。如果我在函数“onloaded”中跟踪它,我会看到我的数组。但它在函数之外没有任何回报。为什么呢?

var myTextLoader:URLLoader = new URLLoader();
var myArray:Array = new Array();


myTextLoader.load(new URLRequest("list.txt"));
myTextLoader.addEventListener(Event.COMPLETE, onLoaded);

function onLoaded(e:Event) {
     myArray = e.target.data.split(/\n/);
     // if trace(myArray); here - I see my array.    
}

trace(myArray); // - output is clear, also it can't define a property, if I'm looking for .length

2 个答案:

答案 0 :(得分:0)

它在函数外部没有返回任何内容的原因是它没有数据。那是因为数据尚未加载到数组中。函数外部的trace(myArray)将在数据尚未保存时立即执行,但函数内部的trace(myArray)load函数在{URLLoader函数执行时执行的{{1}} 1}}完成后,当你加载文件,因此有数据。

答案 1 :(得分:0)

这是您的计划中发生的事件的顺序:

  1. 正在创建myArray。

  2. myTextLoader开始加载内容list.txt。

  3. 将一个事件监听器添加到myTextLoader中,这将导致在list.txt加载完成后执行一个函数。

  4. 您可以跟踪myArray的内容。 myArray目前没有任何内容。

  5. myTextLoader完成加载list.txt

  6. onLoaded函数名为

  7. 数据已添加到myArray


  8. 总结一下,当你试图追踪它时,myArray是空的。如果你想等到list.txt的内容被添加到数组中,那么只需将你的循环放入onLoaded函数中。

    选项1:

    var myTextLoader:URLLoader = new URLLoader();
    var myArray:Array = new Array();
    
    
    myTextLoader.load(new URLRequest("list.txt"));
    myTextLoader.addEventListener(Event.COMPLETE, onLoaded);
    
    function onLoaded(e:Event) 
    {
         myArray = e.target.data.split(/\n/);
         for (var i:int = 0; i < myArray.length; i++)
         {
              trace(myArray[i]);
         }  
    }
    

    如果稍后需要从另一个函数访问该数组,一种解决方案是将数组存储在具有更大范围的变量中。在下面的示例中,在执行onLoaded函数之后,您可以从myArrayLoopF​​unction()访​​问该数组。

    选项2:

    public class Main extends MovieClip
    {
        public var myArray:Array = new Array();
    
        public function Main() 
        {
            var myTextLoader:URLLoader = new URLLoader();
    
            myTextLoader.load(new URLRequest("list.txt"));
            myTextLoader.addEventListener(Event.COMPLETE, onLoaded);
    
            function onLoaded(e:Event) 
            {
                 myArray = e.target.data.split(/\n/);
            }
        }
    
        public function myArrayLoopFunction()
        {
            for (var i:int = 0; i < myArray.length; i++)
            {
                trace(myArray[i]);
            }  
        }
    }