flashactionscript-3flash-cs5

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?


Solution

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