2009-11-05 3 views
0

J'ai construit une classe qui analyse les données JSON, les stocke dans un tableau, et maintenant je veux retourner ces données afin qu'elles puissent être stockées dans un tableau dans mon fichier AS racine. J'essaie finalement de passer le tableau retourné à une autre classe. Ma classe ressemble à ceci:actionscript 3: retourner un tableau dans une classe

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; 
    } 
} 
} 

Quand j'appelle la classe dans la racine fichier AS, mon code ressemble à:

var grabData:DataGrab = new DataGrab(); 
grabData.init(url:String); 
var resultData:Array = grabData.payload(); 

Je continue à obtenir l'erreur suivante cependant:

1061: Appel à une charge utile de méthode éventuellement non définie via une référence de type statique com.src.DataGrab.

Quelqu'un a-t-il des conseils sur ce qui pourrait ne pas fonctionner avec ma classe, ou une façon plus logique d'écrire la fonction getResults() pour que je puisse récupérer le tableau généré par cette classe?

Merci.

+0

BTW, il y a un JSONDecoder dans as3corelib (http://code.google.com/p/as3corelib/), bien que ce ne soit pas très complet ... –

Répondre

5

Problème: essayez-vous d'écrire votre code de manière synchrone, mais une action réseau est asynchrone. C'est-à-dire que vous devez attendre que l'action réseau soit terminée avant de demander les données. Votre meilleur pari, comme l'a dit TandemAdam, est d'utiliser un écouteur d'événements. Quelque chose comme ceci:

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; 
    } 
} 
} 

Ensuite, vous pouvez l'utiliser comme ceci:

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); 

Je suggère fortement de lire plus sur la classe EventDispatcher et la programmation asynchrone. Cela peut aussi aider http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000838.html

+0

+1. Je recommanderais certainement de lire ce lien livesocs. Aussi celui-ci est très utile http://gamedev.michaeljameswilliams.com/2009/02/06/using-as3-event-listeners/ –

+0

J'ai tiré mes cheveux avec quelque chose de similaire pendant 2 jours, et je ne pouvais pas comprendre comment le faire. Cela m'a aidé tout le chemin cependant, donc +1! –

2

Je dirais que la meilleure chose à faire est de simplement avoir votre tableau en tant que propriété publique, et envoyer un événement lorsque les données sont prêtes.

Je voudrais également passer dans la chaîne d'URL directement dans le constructeur, pas à la fonction init. On dirait un pas inutile pour moi.

Je ne vois pas non plus de méthode appelée "charge utile" dans votre code.

Vous devez également utiliser le reverse domain name convention pour nommer votre package de classe.

+0

+ 1 erreur causée par la méthode de charge utile manquante – bguiz

+0

merci, désolé pour ma négligence avec la fonction mal nommée. Je pense que je dois faire une courte pause de codage. – minimalpop

Questions connexes