actionscript 3:在类中返回数组

时间:2009-11-05 00:50:32

标签: flash actionscript-3 arrays

我构建了一个解析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()函数,以便我可以检索这个类生成的数组?

感谢。

2 个答案:

答案 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来命名您的课程包。