AS3:如何从事件侦听器中返回数组?

3
我有一个应用于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;
}

但那也没有什么价值。

所以:我如何从事件监听器返回一个数组?谢谢!

3个回答

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...
}

希望这样能让你更清楚。祝编码愉快!

嗨,我知道这个问题,但我的问题是我需要从我调用的函数中获取数组,我尝试了所有我理解的方法(你所解释的方式),但都没有成功。我似乎无法将函数中使用的数组(在你的示例中为“handleLoadComplete”)带到主舞台上。这有意义吗?这就是我的问题,我需要能够做到这一点,但是由于我对AS3的了解很少,所以我尝试了我发布的内容,并希望它可能是正确的方法...谢谢! - sam
提供的答案是正确的。如果您仍然遇到问题,请具体说明您遇到的问题。您是否意味着您现在能够生成数组,但不知道如何将其传递给另一个函数/作用域?您试图在哪里“使用”数据?更多关于您的设置和示例代码的解释可能会有所帮助。 - sberry
你所尝试的是不可能的。在你的处理函数中,你需要将它分配给所需的数组。 - Tyler Egeto
我有一个名为“loadinformation”的函数,在该函数内部,我有“LoadXML”和“convertXML”。我向“loadinformation”提供一个XML网址,然后执行一些操作并获取XML数据,然后将XML数据传递给LoadXML,它执行一些操作,然后将数据传递给convertXML,最终生成我的最终数据。LoadXML返回一个数组,我需要通过“loadinformation”函数访问此数组。loadinformation(xmlurl) -> LoadXML -> convertXML -> 返回数组。这有意义吗?如果需要,我可以画个图,我不太擅长解释。 - sam
好的,我已经编写了一个基本示例,可以在pastebin.com上找到:http://pastebin.com/d64fe9e06这个示例更清楚地展示了我的目标吗?我想要从“convertXML”获取结果数组,并通过“loadinformation”返回“returnedArray”等于convertXML中的数组。代码可能包含错误,但它只是一个我想要实现的示例,没有经过测试。 - sam

1
为什么不直接使用组件级对象并设置其值(在您的LoadXML()方法中使用xml内容)?
var rArray:Array;
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);

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

嗨,我回复了另一个答案并进一步解释了我想做什么,所以我也会回复你! :) “好的,我制作了一个基本示例,展示我想要实现的内容,可以在pastebin.com 上找到:http://pastebin.com/d64fe9e06 这个示例更好地展示了我的需求吗?我希望从“convertXML”获取到的结果数组通过“loadinformation”返回,因此“returnedArray”= convertXML的数组。代码可能包含错误,但它没有经过测试,只是为了说明我想要实现的东西。” - sam

0

可以让returnedArray包含由convertXML创建的数组,但不是以你尝试的方式。Flash不能这样工作。

当您运行pastebin中的代码时,大致会发生以下情况:

开始运行loadInformation()函数:
  • var returnedArray:Array = loadinformation("http://website.com/xml.xml");
告诉Flash,在xmlLoader完全加载时应运行LoadXML():
  • xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
开始加载一个XML文件:
  • xmlLoader.load(new URLRequest(xmlurl));
告诉Flash什么是LoadXML()(以及convertXML()):
  • function LoadXML(e:Event):void {...}
停止运行loadInformation()函数。
Flash在等待XML文件加载时会去做其他事情。
XML文件加载完成后,Flash像被告知的那样调用LoadXML()。
注意,LoadXML()是由Flash而不是loadInformation()调用的。
LoadXML()处理XML文件。
要获取转换后的数组数据,您需要执行类似于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;
}

嗨,这是我一直在尝试的。我到了convertXML函数并跟踪我的数组(trace(rArray)),它运行得很好,但是如果我在LoadXML中将"returnedArray"赋值为"returnedArray = convertXML(xmlData);",然后跟踪它,我什么也看不到。由于某种原因,returnedArray没有从convertXML获取数组。你有任何想法为什么会这样吗? - sam
等等,它确实可以工作。如果我在执行convertXML(xmlData)后跟踪returnedArray,则将返回结果,但是如果我在已声明convertXML函数的“return returnedArray”之后返回它(例如:我的代码底部),则会返回“Null”。在什么时候应该返回“returnedArray”以使用最终结果? - sam
returnedArray 只会在调用 LoadXML 后包含数据,这发生在 XML 文件完成加载时。剩下的代码是什么样子呢?如果你想让返回的 returnedArray 填充数据时发生更多的事情,你有三个选项:1)在 LoadXML 中添加更多内容。2)创建另一个函数来处理其他事情,并将其作为事件侦听器添加到 xmlLoader 中。3)在 LoadXML 结束时,派发一个事件表示数据已经加载。我可以详细解释其中任何一个选项。 - Selene
谢谢你迄今为止的帮助。你看到你的代码中"LoadXML"中设置了returnedArray吗?我想能够从父函数中访问该结果数组(returnedArray)并将其返回以供进一步使用。http://pastebin.com/m6cb9a430 这是我可以实现的示例。我的问题是,我不能在loadInformation之后只是"return returnedArray",因为LoadXML是由事件处理程序调用的,我无法从该结果创建一个数组。这有意义吗? - sam
好的,你想用XML中的数据数组做什么?要么把那段代码放在LoadXML里面,要么把它放在一个从LoadXML调用的函数里面。 - Selene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接