AS3 Returning a variable from an event listener function

不问归期 提交于 2019-12-11 05:17:28

问题


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:

  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.




回答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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!