min*_*pop 0 arrays flash actionscript-3
我构建了一个解析JSON数据的类,将它存储在一个数组中,现在我想返回该数据,以便它可以存储在我的根AS文件中的数组中.我最终试图将返回的数组传递给另一个类.我的班级看起来像这样:
package com.src
{
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.*;
import com.src.serialization.json.JSON;
public class DataGrab extends Sprite
{
public var jsonData:Object;
public function DataGrab()
{
}
public function init(resource:String):void
{
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest(resource);
loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(request);
}
private function onComplete(e:Event):void
{
var loader:URLLoader = URLLoader(e.target);
jsonData = JSON.decode(loader.data);
}
public function getResults():Array
{
var people = jsonData.people;
var names:Array = people.name;
var payload = new Array();
var counter:Number = 0;
for (var key:Object in names)
{
payload[counter] = [names[key].id, names[key].email];
counter++;
}
return payload;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我在根AS文件中调用该类时,我的代码如下所示:
var grabData:DataGrab = new DataGrab();
grabData.init(url:String);
var resultData:Array = grabData.payload();
Run Code Online (Sandbox Code Playgroud)
但是我不断收到以下错误:
1061:通过带有静态类型com.src.DataGrab的引用调用可能未定义的方法有效内容.
有没有人有关于我的类可能出错的建议,或者更合乎逻辑的方式来编写getResults()函数,以便我可以检索由这个类生成的数组?
谢谢.
问题是您尝试同步编写代码但网络操作是异步的.也就是说,在请求数据之前,您必须等待网络操作完成.正如TandemAdam所说,最好的选择是使用事件监听器.像这样的东西:
package com.src
{
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.*;
import com.src.serialization.json.JSON;
public class DataGrab extends Sprite
{
public var payload:Array;
public function DataGrab()
{
}
public function init(resource:String):void
{
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest(resource);
loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(request);
}
private function onComplete(e:Event):void
{
var loader:URLLoader = URLLoader(e.target);
var jsonData:Object = JSON.decode(loader.data);
// Format the data
var people = jsonData.people;
var names:Array = people.name;
var counter:Number = 0;
payload = new Array();
for (var key:Object in names)
{
payload[counter] = [names[key].id, names[key].email];
counter++;
}
dispatchEvent(new Event(Event.COMPLETE));
}
public function getResults():Array
{
return payload;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
var grabData:DataGrab = new DataGrab();
function dataReadyHandler(event:Event):void {
var grabData:DataGrab = event.target as DataGrab;
trace(grabData.getResults());
// or
trace(grabData.payload);
}
grabData.addEventListener(Event.COMPLETE, dataReadyHandler);
grabData.init(url:String);
Run Code Online (Sandbox Code Playgroud)
我强烈建议您阅读有关EventDispatcher类和异步编程的更多信息.这也可以帮助http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000838.html