【问题标题】:AS3: return array from event listener?AS3:从事件监听器返回数组?
【发布时间】:2010-02-06 22:45:51
【问题描述】:

我有一个事件侦听器应用于 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;
}

但这也不值得。

那么:如何从事件监听器返回一个数组?谢谢!

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    我认为事件侦听器的工作方式有些混乱。实际上,我很惊讶您当前的代码没有出现编译错误。

    添加事件侦听器时,您应该传入的是对稍后要调用的函数的引用。然后,当调用该函数时,它将传递一个 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...
    }
    

    希望这能让你更清楚。

    编码愉快!

    【讨论】:

    • 嗨,我想我知道这一点。我的问题是我需要从我正在调用的函数中取回数组,我从我理解的方式(你解释的方式)尝试的一切都没有奏效,我似乎无法将数组从使用的函数(在您的示例中为“handleLoadComplete”)带到主阶段。这有意义吗?那是我的问题,我需要能够做到这一点,但我对 AS3 的了解很少,找不到方法,所以我尝试了我发布的内容并希望它可能是正确的方法......谢谢!
    • 提供的答案是正确的。如果您仍然遇到问题,请具体说明您遇到的问题。你的意思是你现在可以生成你的数组,但不知道如何将它传递给另一个函数/范围?您在哪里尝试“使用”数据?对您的设置进行更多解释,示例代码可能会有所帮助。
    • 您尝试的操作是不可能的。在您的处理程序函数中,您需要将其分配给所需的数组。
    • 我有一个名为“loadinformation”的函数,在该函数中我有“LoadXML”和“convertXML”。我提供带有 XML url 的“加载信息”,然后它会做一些事情并获取 XML 数据,然后它将 XML 数据传递给 LoadXML,它会做一些事情,然后将这些数据传递给 convertXML,它会产生我的最终数据。 LoadXML 返回一个数组,我需要这个数组可以被“loadinformation”函数访问。 loadinformation(xmlurl) -> LoadXML -> convertXML -> 返回数组。这有意义吗?需要的话我可以画个图,我不太会解释。
    • 好的,我整理了一个我想要实现的基本示例,它可以在 pastebin.com 上找到:pastebin.com/d64fe9e06 这是否显示了我想要更好地实现的目标?我想从“loadinformation”返回“convertXML”的结果数组,所以“returnedArray”=来自 convertXML 的数组。该代码可能包含错误,但未经测试,只是作为我想要实现的示例。
    【解决方案2】:

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

    var rArray:Array;
    xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
    
    private function LoadXML(event:Event=null):void {
        // set this.rArray in here...
    }
    

    【讨论】:

    • 嗨,我回复了另一个答案,进一步解释了我想要做什么,所以我也会回复你! :) “好的,我整理了一个我想要实现的基本示例,它可以在 pastebin.com 上找到:pastebin.com/d64fe9e06 这是否显示了我想要更好地实现的目标?我想将结果数组从“convertXML”获取到由“loadinformation”返回,所以“returnedArray”=来自convertXML的数组。代码可能包含错误,但没有经过测试,只是作为我想要实现的示例。”
    【解决方案3】:

    可以让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. Flash 在等待 XML 文件加载时熄灭并执行其他操作
    7. XML 文件完成加载。 Flash 调用 LoadXML() 就像它被告知的那样。
      • 请注意,LoadXML() 是由 Flash 调用的,不是是由 loadInformation() 调用的。
    8. Lo​​adXML() 处理 XML 文件。

    要得到转换后的数组数据,你需要做类似小丑宝宝的回答:在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;
    }
    

    【讨论】:

    • 嗨,这是我一直在尝试的。我使用 convertXML 函数并跟踪我的数组 (trace(rArray)),它工作正常,但是如果我随后将“returnedArray”分配给“returnedArray = convertXML(xmlData);” (在 LoadXML 内)并跟踪它我什么也没得到。由于某种原因,returnedArray 没有从 convertXML 获取数组。任何想法为什么会这样?
    • 等等,没关系,它确实有效。如果我在执行 convertXML(xmlData); 之后追踪出返回数组;它给了我结果,但如果我在声明 convertXML 函数之后“返回返回数组”(例如:我的代码的底部),它返回“空”。我应该在什么时候返回“returnedArray”才能使用最终结果?
    • returnedArray 将只包含数据之后 LoadXML 被调用,这发生在 XML 文件完成加载时。其余的代码是什么样的?如果您希望在返回数组充满数据时发生更多事情,您有三个选择:1) 向 LoadXML 添加更多内容。 2) 使用附加内容创建第二个函数,并将其作为事件侦听器添加到 xmlLoader。 3) 在 LoadXML 结束时,调度一个事件,说明数据已加载。我可以扩展您希望的三个中的任何一个。
    • 感谢您迄今为止的帮助。您是否看到代码中的 returnedArray 是如何在“LoadXML”中设置的?好吧,我希望能够从父函数访问该结果数组(returnedArray)并将其返回以供进一步使用。 pastebin.com/m6cb9a430 这是我可以实现的一个例子。我的问题是我不能只是在 loadInformation 之后“返回返回的数组”,因为 LoadXML 是由事件处理程序调用的,我无法根据结果创建一个数组。这有意义吗?
    • 好的,你想对来自 XML 的数据数组做什么?要么将该代码放在 LoadXML 中,要么将它放在您从 LoadXML 调用的函数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多