问题
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?
回答1:
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 
}
回答2:
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);
}
回答3:
Without serious modifications you have two options:
- Your - SaveAndLoadclass to derrive EventDispatcher and send a custom event with the data in it.
- More clean/non obtrusive is to make - sendDatamethod 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.
回答4:
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));
回答5:
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);
}
来源:https://stackoverflow.com/questions/7587665/as3-returning-a-variable-from-an-event-listener-function