AS3:从事件监听器返回数组?

时间:2010-02-06 22:45:51

标签: actionscript-3 flash

我有一个应用于xml加载的事件监听器,它当前跟踪它抓取的值,这很好,但我想要它做的是返回一个数组供我使用。我有数组创建并从“LoadXML”返回工作(它返回数组)但我无法使用事件监听器。

事件监听器运行“LoadXML”函数很好,但我不知道如何使用返回的数组,这是我的事件监听器现在如何工作的一个例子:

xmlLoader.addEventListener(Event.COMPLETE, LoadXML());

以及我对如何使用数组的假设(这不起作用):

var rArray:Array = xmlLoader.addEventListener(Event.COMPLETE, LoadXML());

所以我尝试了以下内容:

xmlLoader.addEventListener(Event.COMPLETE, function():Array{
    var rData:Array = LoadXML(datahere);
    return rData;
}

但这也不值得。

那么:我如何从eventlistener返回一个数组?谢谢!

3 个答案:

答案 0 :(得分:2)

我认为事件监听器的工作原理存在一些混淆。实际上,我很惊讶你的当前代码没有编译错误。

添加事件侦听器时,您应该传入的内容是对稍后要调用的函数的引用。然后,当调用该函数时,它将传递一个Event对象,其中包含任何已恢复的数据以供使用。这是一个例子:

xmlLoader.addEventListener(Event.COMPLETE, handleLoadComplete/*Note: No brackets, this is a reference*/);

//will be called at a later time, not instantly.
function handleLoadComplete(e:Event):void {
    var xml:XML = xmlLoader.data as XML;
    //do what ever you want this the XML...
}

希望这能让你更清楚。

快乐的编码!

答案 1 :(得分:1)

为什么不使用组件级对象并设置其值(LoadXML()方法中的xml内容)?

var rArray:Array;
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);

private function LoadXML(event:Event=null):void {
    // set this.rArray in here...
}

答案 2 :(得分:0)

有可能使得returnedArray包含一个由convertXML创建的数组,但不是你尝试这样做的方式。 Flash根本不起作用。

这大致是从pastebin运行代码时发生的事情:

  1. 开始运行函数loadInformation()
    • var returnedArray:Array = loadinformation("http://website.com/xml.xml");
  2. 告诉Flash当xmlLoader完全加载时,它应该运行LoadXML()
    • xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
  3. 开始加载XML文件
    • xmlLoader.load(new URLRequest(xmlurl));
  4. 告诉Flash LoadXML()是什么(和convertXML())
    • function LoadXML(e:Event):void {...}
  5. 停止运行函数loadInformation()
  6. 在等待加载XML文件时,Flash会关闭并执行其他操作
  7. XML文件完成加载。 Flash调用LoadXML()就像它被告知的那样。
    • 请注意,LoadXML()由Flash调用,而不是由loadInformation()调用。
  8. LoadXML()处理XML文件。
  9. 要获取转换后的数组数据,您需要执行类似clownbaby的答案:在LoadXML内部直接设置returnedArray的值。

    var returnedArray:Array;
    
    loadinformation("http://website.com/xml.xml");
    
    function loadinformation(xmlurl:String):Array{
        var xmlLoader:URLLoader = new URLLoader();
        var xmlData:XML = new XML();
        xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
        xmlLoader.load(new URLRequest(xmlurl));
    }
    
    function LoadXML(e:Event):void {
        xmlData = new XML(e.target.data);
        returnedArray = convertXML(xmlData);
    }
    
    function convertXML(xml):Array{
        // Does some stuff with the XML and returns an array
        return rArray;
    }