我构建了一个解析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;
}
}
}
当我在根AS文件中调用该类时,我的代码如下:
var grabData:DataGrab = new DataGrab();
grabData.init(url:String);
var resultData:Array = grabData.payload();
但我仍然收到以下错误:
1061:通过带有静态类型com.src.DataGrab的引用调用可能未定义的方法有效负载。
有没有人有关于我的类可能出错的建议,或者更合乎逻辑的方式来编写getResults()函数,以便我可以检索这个类生成的数组?
感谢。
答案 0 :(得分:5)
问题是您正在尝试同步编写代码,但网络操作是异步的。也就是说,在请求数据之前,您必须等待网络操作完成。正如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;
}
}
}
然后你可以像这样使用它:
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);
我强烈建议您阅读有关EventDispatcher类和异步编程的更多信息。这也有助于http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000838.html
答案 1 :(得分:2)
我想说最好的办法就是将你的数组作为公共属性,并在数据准备就绪时调度一个事件。
我也会将url字符串直接传递给构造函数,而不是传递给init函数。对我来说似乎是一个不必要的步骤。
我也没有在你的代码中看到一个名为“payload”的方法。
您还应该使用reverse domain name convention来命名您的课程包。