2009-11-05 62 views
0

我構建了一個類來解析JSON數據,將它存儲在一個數組中,現在我想返回該數據以便它可以存儲在我的根AS文件中的數組中。我最終試圖將返回的數組傳遞給另一個類。我的階級是這樣的:actionscript 3:返回類中的數組

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

順便說一句,as3corelib(http://code.google.com/p/as3corelib/)中有一個JSONDecoder,雖然這不是很完整... – 2009-11-05 14:30:28

回答

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

+0

+1。我會毫不猶豫地推薦閱讀livedocs鏈接。這一個是相當有幫助的http://gamedev.michaeljameswilliams.com/2009/02/06/using-as3-event-listeners/ – 2009-11-05 03:32:20

+0

我一直在拉我的頭髮與類似的東西2天,並不能瞭解如何去做。這幫助我一路,所以+1! – 2011-08-29 20:20:04

2

我會說最好的辦法就是將你的數組作爲公共屬性,並在數據準備好時分派一個事件。

我也將url字符串直接傳入構造函數,而不是init函數。對我來說似乎是一個不必要的步驟。

我也沒有看到在你的代碼中稱爲「有效載荷」的方法。

您還應該使用reverse domain name convention來命名您的類包。

+0

錯誤的有效載荷方法導致的+1錯誤 – bguiz 2009-11-05 01:38:55

+0

非常感謝,對於我的疏忽與錯誤的功能。我想我需要從編碼中稍作休息。 – minimalpop 2009-11-05 03:20:03