user2157622
user2157622

Reputation: 47

Putting Urlloader in a Class

I have searched on google en different pages i found the problem but not the solution.

I have a class i made and that class is called WebServiceController:

public class WebServiceController 
{
    private var url:String;
    private var post:Object=new Object();
    private var loader:URLLoader = new URLLoader();
    private var postVariable:String="";
    private var getVariable:String="";
    private var Geladen:Boolean=false;

    public function WebServiceController() 
    {   

    }

    public function postUrlData(u:String,p:Object):String
    {
        url=u;
        post=p;

        var urlReq:URLRequest = new URLRequest (url);


        var i:int=0;
        for(var key:String in post) 
        {
           //trace(key +" = " + post[key]);
           if(i==0)
           {
              // urlVars.key = post[key];
               postVariable=postVariable+""+key+"="+post[key];
           }
           else
           {
               //urlVars.key = post[key];
               postVariable=postVariable+"&"+key+"="+post[key];
           }
           i++;
        }
        //trace(postVariable);
        var urlVars:URLVariables = new URLVariables(postVariable);

        //trace(urlVars);

        // Add the variables to the URLRequest
        urlReq.data = urlVars;
        urlReq.method = URLRequestMethod.POST;


        // Add the URLRequest data to a new Loader
        //loader.load(urlReq);

        // Set a listener function to run when completed
        loader.addEventListener(Event.COMPLETE, onLoaderComplete);

        // Set the loader format to variables and post to the PHP
        loader.dataFormat = URLLoaderDataFormat.VARIABLES;
        loader.load(urlReq); 

        function onLoaderComplete(event:Event):void
        {
            return loader.data;
        }

    }

Now from my movieclip i call the next function but it says undefined:

var wb:WebServiceController = new WebServiceController();
trace(wb.postUrlData(url,post));

I dont know how to solve this. I tried different things but it keeps saying undefined.

Upvotes: 0

Views: 70

Answers (1)

net.uk.sweet
net.uk.sweet

Reputation: 12431

The URLLoader.load call is executed asynchronously so the data has not been returned when you attempt to trace it out in the class that instantiates your WebServiceController class.

To access the data in the parent class, your best bet is probably to dispatch an event from the WebServiceController class when the data has loaded and catch it in the parent class.

WebServiceController:

  public function postUrlData(u:String, p:Object):void
  {
      url=u;
      post=p;

      var urlReq:URLRequest = new URLRequest (url);


      var i:int=0;
      for(var key:String in post) 
      {
         //trace(key +" = " + post[key]);
         if(i==0)
         {
            // urlVars.key = post[key];
             postVariable=postVariable+""+key+"="+post[key];
         }
         else
         {
             //urlVars.key = post[key];
             postVariable=postVariable+"&"+key+"="+post[key];
         }
         i++;
      }
      //trace(postVariable);
      var urlVars:URLVariables = new URLVariables(postVariable);

      //trace(urlVars);

      // Add the variables to the URLRequest
      urlReq.data = urlVars;
      urlReq.method = URLRequestMethod.POST;


      // Add the URLRequest data to a new Loader
      //loader.load(urlReq);

      // Set a listener function to run when completed
      loader.addEventListener(Event.COMPLETE, onLoaderComplete);

      // Set the loader format to variables and post to the PHP
      loader.dataFormat = URLLoaderDataFormat.VARIABLES;
      loader.load(urlReq); 
  }

  private function onLoaderComplete(event:Event):void
  { 
      // We can pass the event on like this
      dispatchEvent(event); 
  }

Parent class:

public function initWebServiceController():void 
{
  var wb:WebServiceController = new WebServiceController();
  wb.addEventListener(Event.COMPLETE, onWebServiceControllerDataLoaded);
  wb.postUrlData(url, post);
}

private function onWebServiceControllerDataLoaded(event:Event):void
{
  // The event target is the URLLoader instance. We can 
  // access the loaded data via its data property
  trace(URLLoader(event.target).data);  
}

Upvotes: 2

Related Questions