Foros del Web » Creando para Internet » Flash y Actionscript »

addEventListener + return

Estas en el tema de addEventListener + return en el foro de Flash y Actionscript en Foros del Web. Código HTML: UrlXml.addEventListener(Event.COMPLETE, Completado); El codigo anterior ejecuta la funcion Completado cuando se complata la descarga de un documento xml quiero remplazar el "addEventListener" por ...
  #1 (permalink)  
Antiguo 26/12/2009, 15:28
 
Fecha de Ingreso: diciembre-2008
Ubicación: Lima - Perú
Mensajes: 187
Antigüedad: 15 años, 4 meses
Puntos: 3
addEventListener + return

Código HTML:
UrlXml.addEventListener(Event.COMPLETE, Completado);
El codigo anterior ejecuta la funcion Completado cuando se complata la descarga de un documento xml

quiero remplazar el "addEventListener" por "if". es decir un codigo que reconozca cuando se ha completado la descarga del documento xml pero usando "if"
algo asi

Código HTML:
if (documento descargado)
{
      ...codigo
}
El problemas es que con "addEventListener" la funcion Completado no es capaz de retornar un valor

alguien sabe como remplazar "addEventListener" por "if"?
O hacer que la funcion completado retorne un valor incluso usando "addEventListener"???

Gracias por su ayuda
  #2 (permalink)  
Antiguo 27/12/2009, 16:02
Avatar de Eskombro  
Fecha de Ingreso: septiembre-2009
Ubicación: Colombia
Mensajes: 437
Antigüedad: 14 años, 7 meses
Puntos: 22
Respuesta: addEventListener + return

Pero puedes utilizar 'return' dentro de la función Completado para que devuelva un valor específico...
__________________
Blog AS3 Ideas -> Programación en ActionScript 3
________
Esk Games | Free online flash games
  #3 (permalink)  
Antiguo 27/12/2009, 17:21
 
Fecha de Ingreso: marzo-2007
Ubicación: México
Mensajes: 133
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: addEventListener + return

y... que deseas regresar?
digo, la ventaja de usar el evento complete es que cuando este termina de ejecutarse (el tiempo que tarde en cargarse ), puedes llamar a otra función y pasarle el valor que consideres. si quieres que te regrese lo cargado pues no hace falta por que entonces la variable loader tendrá los datos que haz cargado, solo hasta que complete sea registrado como terminado.

Entonces, llamando a otra función que haga uso de loader (si la variable es de clase y no local) podrás utilizar los datos a placer...

corríjame alguien si estoy equivocado.... espero te sirva
  #4 (permalink)  
Antiguo 27/12/2009, 23:12
 
Fecha de Ingreso: diciembre-2008
Ubicación: Lima - Perú
Mensajes: 187
Antigüedad: 15 años, 4 meses
Puntos: 3
Respuesta: addEventListener + return

Ante todo gracias por sus respuestas.

Este es el codigo que tengo en el archivo .fla(creo que se llama documenoto raiz, corríganme porfavor)

Código:
var mylibXml:libXml = new libXml();
mylibXml.CargarXml("datos.xml");
Y este es el codigo que tengo en el archivo libXml.as

Código:
package
{
	import flash.events.Event;  
	import flash.net.URLLoader;  
	import flash.net.URLRequest;
	
	public class libXml
	{
		public var ArchivoXml:XML;
		public var UrlXml:URLLoader = new URLLoader();	

		public function CargarXml(Archivo:String):void
		{
			var Archivo2:URLRequest = new URLRequest(Archivo);  
			UrlXml.load(Archivo2);			
			UrlXml.addEventListener(Event.COMPLETE, Completado);			
		}
	
		public function Completado(event:Event):void
		{
			ArchivoXml = new XML(UrlXml.data);
		}

	}
}
Cuando modifico la funcion "CargarXml" para que retorne la variable "ArchivoXml", me la retorna sin valor(como un objeto nulo) y es porque esta variable es retornada antes de que el evento load de "UrlXml" sea comletado, entonces quice modificar la funcion completado para que me retorne el valor pero parece que el codigo

Código:
UrlXml.addEventListener(Event.COMPLETE, AlgunaVariable=Completado);
No funciona

Ayudaaaaaaaaaaaaaa!!!!

Gracias
  #5 (permalink)  
Antiguo 28/12/2009, 00:32
Avatar de Eskombro  
Fecha de Ingreso: septiembre-2009
Ubicación: Colombia
Mensajes: 437
Antigüedad: 14 años, 7 meses
Puntos: 22
Respuesta: addEventListener + return

Precisamente debes poner dentro de la función completado el return.

return ArchivoXml;

Así no te sirve? Esa función solo se debe ejecutar si la carga ha sido completa. Sí se ejecuta, pero como la variable ArchivoXml está solo dentro de la función, cuando le dices AlgunaVariable=Completado
AlgunaVariable está tomando el valor que devuelve la función, que para este caso no es ningun valor. Por eso dice Void. Void significa que no debe devolver un valor. Debes eliiminar el void, y en vez de éste puedes poner el tipo de datos que te va a devolver, es decir, uint, int, Number, etc... y ponerle return ArchivoXml para que este sea el valor que devuelve la función...

Un saludo
Eskombro
__________________
Blog AS3 Ideas -> Programación en ActionScript 3
________
Esk Games | Free online flash games
  #6 (permalink)  
Antiguo 28/12/2009, 15:24
 
Fecha de Ingreso: diciembre-2008
Ubicación: Lima - Perú
Mensajes: 187
Antigüedad: 15 años, 4 meses
Puntos: 3
Respuesta: addEventListener + return

Esto tengo en el .fla

Código:
var mylibXml:libXml = new libXml();
var ArchivoXML2:XML;
ArchivoXML2= new XML(mylibXml.CargarXml("datos.xml"));
trace(ArchivoXML2.pic[1].image);
Y esto en el .as

Código:
package
{
	import flash.events.Event;  
	import flash.net.URLLoader;  
	import flash.net.URLRequest;
	
	public class libXml
	{
		public var ArchivoXml:XML=new XML();
		public var UrlXml:URLLoader = new URLLoader();	
		
		public function CargarXml(Archivo:String):XML
		{
			var Archivo2:URLRequest = new URLRequest(Archivo);  
			UrlXml.load(Archivo2);	
			UrlXml.addEventListener(Event.COMPLETE, ArchivoXml=Completado);
			return ArchivoXml;
		}
	
		public function Completado(event:Event):XML
		{
			ArchivoXml = new XML(UrlXml.data);
			return ArchivoXml;
		}

	}
}

Salen los siguientes errores

Código:
"1067: Conversión implícita de un valor de tipo Function a un tipo XML no relacionado."

"1067: Conversión implícita de un valor de tipo XML a un tipo Function no relacionado."
Y si cambio "ArchivoXml=Completado" por "Completado"

En la pestaña salida (ya no en errores) sale lo siguiente

Código:
"TypeError: Error #1010: Un término no está definido y no tiene propiedades.
	at LibXml_fla::MainTimeline/frame1()"
  #7 (permalink)  
Antiguo 29/12/2009, 13:43
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 16 años, 4 meses
Puntos: 51
Respuesta: addEventListener + return

yo tengo un código mas complejo pero me ayuda ya que es muy rápido de emplear una ves colocado


as

Código PHP:
package com.cfx.basic{
    
import flash.events.*;
    
import flash.net.*;
    public class 
Xml {
        private static  const 
FuncObj:Array=['COMPLETE','PROGRESS','ERROR','HTTP_STATUS'];
        public static function 
load(url:String,Func:Object=null):void {
            var 
func:Array=new Array;
            if (
Func == null) {
                for (var 
i:int=0i<FuncObj.lengthi++) {
                    
func[FuncObj[i]]=function(...rest){};
                }
            } else {
                for (var 
j:int=0j<FuncObj.lengthj++) {
                    if (
Func[FuncObj[j]] is Function) {
                        
func[FuncObj[j]]=Func[FuncObj[j]];
                    } else {
                        
func[FuncObj[j]]=function(...rest){};
                    }
                }
            }
            var 
loadXML:URLLoader=new URLLoader();
            
configureListeners(loadXML);
            
loadXML.load(new URLRequest(url));
            try {
                
loadXML.load(new URLRequest(url));
            } catch (
error:Error) {
                
func.ERROR('Carga Fallida');
            }
            function 
configureListeners(dispatcher:IEventDispatcher):void {
                
dispatcher.addEventListener(Event.COMPLETEcompleteHandler);
                
dispatcher.addEventListener(ProgressEvent.PROGRESSprogressHandler);
                
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERRORsecurityErrorHandler);
                
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUShttpStatusHandler);
                
dispatcher.addEventListener(IOErrorEvent.IO_ERRORioErrorHandler);

            }
            function 
completeHandler(event:Event):void {
                var 
loader:URLLoader URLLoader(event.target);
                
func.COMPLETE(XML(loader.data));
            }
            function 
progressHandler(event:ProgressEvent):void {
                
func.PROGRESS(event.bytesLoaded,event.bytesTotal);
            }
            function 
securityErrorHandler(event:SecurityErrorEvent):void {
                
func.ERROR(String(event));
            }
            function 
httpStatusHandler(event:HTTPStatusEvent):void {
                
func.HTTP_STATUS(event);
            }
            function 
ioErrorHandler(event:IOErrorEvent):void {
                
func.ERROR(event);
            }
        }
    }


ejemplo

Código PHP:
package {
    
import com.cfx.basic.Xml;
    public class 
ejemploXML {
        public var 
miXml:XML;
        public function 
ejemploXML ():void {
            
Xml.load('ejemplo.xml',{COMPLETE:loadXML});
            
        }
        public function 
loadXML(xml:XML):void {
            
miXml=xml;
            
trace(xml)
        }
        
    }

una ves que ha completado la carga devuelve el xml y ejecuta la función que quieras
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #8 (permalink)  
Antiguo 29/12/2009, 16:35
 
Fecha de Ingreso: diciembre-2008
Ubicación: Lima - Perú
Mensajes: 187
Antigüedad: 15 años, 4 meses
Puntos: 3
Respuesta: addEventListener + return

Lo que pasa es que en mi proyecto uso mas de un archivop xml, por eso necesito el return.

Mi clase si funciona pero la unica variable que contiene el archivo XMl es la variable ArchivoXML, la que solo puede almacenar un documento XMl a la vez por eso quice modificar mi funcion para que me retorne un valor diferente cada vez que la llane y esos valores se los asigne a variables diferentes y poder trabajar con mas de un XML a la vez.

Gracias
  #9 (permalink)  
Antiguo 30/12/2009, 10:42
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 16 años, 4 meses
Puntos: 51
Respuesta: addEventListener + return

jejej por eso lo que te pase arriba esta para ello para cargar varios xml sin mucho esfuerzo
Código PHP:
package {
    
import com.cfx.basic.Xml;
    public class 
ejemploXML {
        public var 
miXml1:XML;
        public var 
miXml2:XML;
        public var 
miXml3:XML;

        public function 
ejemploXML ():void {
            
Xml.load('ejemplo1.xml',{COMPLETE:loadXML1});
            
Xml.load('ejemplo2.xml',{COMPLETE:loadXML2});
            
Xml.load('ejemplo3.xml',{COMPLETE:loadXML3});

            
        }
        public function 
loadXML1(xml:XML):void {
            
miXml1=xml;
            
trace(xml)
        }
        public function 
loadXML2(xml:XML):void {
            
miXml2=xml;
            
trace(xml)
        }
       public function 
loadXML3(xml:XML):void {
            
miXml3=xml;
            
trace(xml)
        }

        
    }

o también



Código PHP:
package {
    
import com.cfx.basic.Xml;
    public class 
ejemploXML {
        public var 
misXml:Array=new Array();

        public function 
ejemploXML ():void {
            
Xml.load('ejemplo1.xml',{COMPLETE:loadXML});
            
Xml.load('ejemplo2.xml',{COMPLETE:loadXML});
            
Xml.load('ejemplo3.xml',{COMPLETE:loadXML});

            
        }
        public function 
loadXML(xml:XML):void {
            
misXml.push(xml);
            
MuestralosXML()
        }   
        public function 
MuestralosXML():void {
           for (var 
i:int=0;i<misXml.length;i++){
               
trace(misXml[i])
           }
        }   
    }

__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft

Última edición por Lynxcraft; 30/12/2009 a las 10:49
  #10 (permalink)  
Antiguo 30/12/2009, 13:07
 
Fecha de Ingreso: diciembre-2008
Ubicación: Lima - Perú
Mensajes: 187
Antigüedad: 15 años, 4 meses
Puntos: 3
Respuesta: addEventListener + return

Ahora entiendo tu codigo es cierto lo que dices, pero tb tengo otro problema.

Mira este pequeño código que se tiene que pegar en el mismo documento .fla

Código:
var ArchivoXml:XML=new XML();
var UrlXml:URLLoader = new URLLoader();	
var si:Boolean=false;
var retardo:Timer = new Timer(1);
var Archivo:URLRequest = new URLRequest("datos.xml");  
UrlXml.load(Archivo);
UrlXml.addEventListener(Event.COMPLETE, Completado);

function Completado(event:Event):void
{
	ArchivoXml = new XML(UrlXml.data);
	si=true;
}

function Ver(event:TimerEvent):void
{
	if (si)
	{
		trace(ArchivoXml);
		retardo.stop();
	}
	else	
		trace("AUN NO");
	
}

retardo.addEventListener(TimerEvent.TIMER, Ver);
retardo.start();
Mientras el evento "load" no sea completado, muetra el mensaje "aun no", y cuando se comlpeta el evento, muestra el documento xml.

El problema es que si yo trato de acceder a la variable "ArchivoXml" antes de que el vento "load" se complete, no habrá respuesta. Y esto se resuelve con la función "completado" que accede a dicha variable justo cuando dicho evento se completa.

Mi pregunta es: Cómo puedo acceder a la variable "ArchivoXml" después de que el evento load se complete sin usar la funcion "completado"?

es decir sin usar
Código:
UrlXml.addEventListener(Event.COMPLETE, Completado);
He intentado poner un bucle que interrumpa las instrucciones hasta que se complete el evento "load" pero no logre nada.

Ahora, usando el timer podría lograr lo que quiero pero me parece una manera muy informal(aunque se pude), bueno si alguien sabe como se lo agaradeceré.

Última edición por diego1311; 30/12/2009 a las 13:15
  #11 (permalink)  
Antiguo 08/01/2010, 14:12
 
Fecha de Ingreso: diciembre-2008
Ubicación: Lima - Perú
Mensajes: 187
Antigüedad: 15 años, 4 meses
Puntos: 3
Respuesta: addEventListener + return

Bueno ya lo solucione. Jeje
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:06.