adamzwakk
adamzwakk

Reputation: 709

AS3 Returning a variable from an event listener function

I'm trying to return XML from an event complete back to the main function, but can't figure out how to do it.

Here's the functions I'm calling:

Main File:

public var mySendAndLoad:SendAndLoad = new SendAndLoad(); 

mySendAndLoad.sendData(url,variables)

The mySendAndLoad class:

package 
{

    import flash.events.*;
    import flash.net.*;
    import flash.xml.XMLDocument;

    public class SendAndLoad
    {
        public var xml:XML = new XML();
        public var xmlList:XMLList;

        public function SendAndLoad()
        {
        }
        public function sendData(url:String, _vars:URLVariables):String
        {
            var request:URLRequest = new URLRequest(url);
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.TEXT;
            request.data = _vars;
            request.method = URLRequestMethod.POST;
            loader.addEventListener(Event.COMPLETE, handleComplete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
            loader.load(request);
        }
        private function handleComplete(event:Event):String
        {
            var loader:URLLoader = URLLoader(event.target);
            xml = XML(loader.data);
            xmlList = xml.children();
            return(xmlList[1]);
        }
        private function onIOError(event:IOErrorEvent):void
        {
            trace("Error loading URL.");
        }
    }
}

What I want to happen is have the xmlList come back to the main file. But since it isn't in the event I called (sendData) it doesn't get brought back.

Any ideas?

Upvotes: 1

Views: 4120

Answers (5)

Toprak
Toprak

Reputation: 293

You must use dispatchEvent;

first declare to it

public class personal_info extends EventDispatcher { }

and you must define listener into that class

   dispatchEvent(new Event(Event.COMPLETE));

Upvotes: 0

Toprak
Toprak

Reputation: 293

you must declare variable such as public
public var variable:String;

You must use dispatchEvent;

first declare to it
   public class personal_info extends EventDispatcher {
   ...

and you must define listener into that complete event
   variable = "variable";
   dispatchEvent(new Event(Event.COMPLETE));
   ...

And you must call just like calling normal event in another class
   var sample:SampleClass = new SampleClass ();
   sample.addEventListener(Event.COMPLETE , cComplete);

And you can use that variable in this class like:
  private fonction (e:Event):void {
    trace (e.target.variable);
}

Upvotes: 0

pho
pho

Reputation: 25489

package 
{

import flash.events.*;
import flash.net.*;
import flash.xml.XMLDocument;

//THIS CLASS EXTENDS EVENTDISPATCHER SO IT CAN DISPATCH EVENTS
public class SendAndLoad extends EventDispatcher
{
    public var xml:XML = new XML();
    public var xmlList:XMLList;

    public function SendAndLoad()
    {
        super(null);
    }
    public function sendData(url:String, _vars:URLVariables):void
    {
        var request:URLRequest = new URLRequest(url);
        var loader:URLLoader = new URLLoader();
        loader.dataFormat = URLLoaderDataFormat.TEXT;
        request.data = _vars;
        request.method = URLRequestMethod.POST;
        loader.addEventListener(Event.COMPLETE, handleComplete);
        loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
        loader.load(request);
    }
    private function handleComplete(event:Event):void
    {
        var loader:URLLoader = URLLoader(event.target);
        xml = XML(loader.data);
        xmlList = xml.children();


        //NEW CODE
        var evt:Event=new Event(Event.COMPLETE);
        dispatchEvent(evt);
        //return(xmlList[1]);
    }
    private function onIOError(event:IOErrorEvent):void
    {
        trace("Error loading URL.");
    }
}

}

and in the main file

public var mySendAndLoad:SendAndLoad = new SendAndLoad(); 
mySendAndLoad.addEventListener(Event.COMPLETE, xmlLoadCompleted);
mySendAndLoad.sendData(url,variables)

private function xmlLoadCompleted(e:Event):void {
    var childToUse:XML=mySendAndLoad.xmlList[1];
    //whatever else you want to do 
}

Upvotes: 1

Ivan Raykov
Ivan Raykov

Reputation: 141

Without serious modifications you have two options:

  1. Your SaveAndLoad class to derrive EventDispatcher and send a custom event with the data in it.

  2. More clean/non obtrusive is to make sendData method modifications:

    public function sendData(url:String, _vars:URLVariables, resultHandler:Function=null):String
    {
        loader.addEventListener(Event.COMPLETE, resultHandler);
    }
    

You can pass a function defined in your main file, still have the ability to attach inner listeners for whatever you want in SaveAndLoad class, and you will have your data.

Upvotes: 0

The_asMan
The_asMan

Reputation: 6402

Just dispatch an event

package 
{

    import flash.events.Event;
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.*;
    import flash.xml.XMLDocument;

    public class SendAndLoad extend Sprite
    {
        public var xml:XML = new XML();
        public var xmlList:XMLList;

        public function SendAndLoad()
        {
        }
        public function sendData(url:String, _vars:URLVariables):String
        {
            var request:URLRequest = new URLRequest(url);
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.TEXT;
            request.data = _vars;
            request.method = URLRequestMethod.POST;
            loader.addEventListener(Event.COMPLETE, handleComplete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
            loader.load(request);
        }
        private function handleComplete(event:Event):String
        {
            var loader:URLLoader = URLLoader(event.target);
            xml = XML(loader.data);
            xmlList = xml.children();


           // return(xmlList[1]);
           this.dispatchEvent( new Event( 'ONDATA' ) );
        }
        private function onIOError(event:IOErrorEvent):void
        {
            trace("Error loading URL.");
        }
    }
}


// usage
var sender:SendAndLoad = new SendAndLoad( );
sender.addEventListener( 'ONDATA', myXMLLoaded);
sender.sendData( url, _vars )

function myXMLLoaded( e:Event ):void{
  trace(sender.xml);
}

Upvotes: 0

Related Questions