actionscript 3:在类中返回数组

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()函数,以便我可以检索由这个类生成的数组?

谢谢.

Jot*_*ham 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;
  }
 }
}
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