Comunidad de diseño web y desarrollo en internet online

Como retornar en esta funcion?

Citar            
MensajeEscrito el 11 Ene 2008 08:45 pm
Pregunta de concepto. tengo un par de funciones dentro de un metodo estatico, como este:

Código :

public static function serverURL():String {
         var myXML:XML = new XML();
         var XML_URL:String = "LocalData.xml";
         var myXMLURL:URLRequest = new URLRequest(XML_URL);
         var myLoader:URLLoader = new URLLoader(myXMLURL);
         myLoader.addEventListener("complete", xmlLoaded);

         function xmlLoaded(event:Event):void {
            myXML = XML(myLoader.data);
            trace("Data loaded.");
         }
         return myXML.toString();
      }


Es un codigo para levantar un archivo XML y devolver el contenido como string. Lo quiero 'encapsular' dentro de un static. Pero asi como esta (por una cuestion de scope supongo) myXML no devuelve nada, es una variable declarada pero sin inicializar, ya que xmlLoaded() es llamado en el complete de myLoader... :oops:

Alguna idea? Desde ya muchas gracias!

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 11 Ene 2008 10:27 pm
Así a primera vista diría que no tiene nada que ver con el scope, sino que estás mezclando funcionamientos.

Llamas a una función que hace un return de myXML, pero myXML se llena con un evento complete del Loader, que es asíncrono. Es normal que myXML esté vacío, ya que se retorna antes que la carga esté finalizada.

Lo mejor sería que pusieras la función de complete como método de clase, y cuando esté cargado ya puedes dispachar un evento o controlar myXML directamente ahí.

Saludos

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

firefox
Citar            
MensajeEscrito el 11 Ene 2008 10:43 pm
Gracias por la respuesta llops!
Entiendo tu explicación. Pero sera mucho pedir que lo ejemplificaras un poco? O un link/tutorial o algo donde pueda estudiarlo un poco mas?
Gracias!

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 12 Ene 2008 11:10 am

Código :

package {   
   import flash.net.URLRequest;
   import flash.net.URLLoader;
   import flash.events.*;

   public class Main{
      private var _xml:XML;
      
      public function Main(){
         cargarXML();
      }
      
      private function cargarXML():void {
         var loader:URLLoader = new URLLoader();
         loader.addEventListener(Event.COMPLETE, xmlLoaded);
         loader.load(new URLRequest("LocalData.xml"));
      }
      
      private function xmlLoaded(e:Event):void {
         _xml = new XML(e.target.data);
         trace(_xml);
         // A partir de aqui ya puedes utilizar _xml
         // en cualquier punto del programa         
      }
   }
}


El ejemplo lo hago de cabeza, no lo he probado, pero el mecanismo es ese. Pruébalo y nos cuentas.

Un saludo!

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

firefox
Citar            
MensajeEscrito el 29 Ene 2008 05:51 pm
Llops, gracias por la respuesta y el ejemplo. No me funciona como quisiera. Por ejemplo:

Código :

package {
   import flash.net.URLRequest;
   import flash.net.URLLoader;
   import flash.events.*;
   public class retornaXML{
      private var _xml:XML;
      public function retornaXML() {
         cargarXML();
      }
      
      private function cargarXML():void {
         var loader:URLLoader = new URLLoader();
         loader.addEventListener(Event.COMPLETE, xmlLoaded);
         loader.load(new URLRequest("LocalData.xml"));
      }
      private function xmlLoaded(e:Event):void {
         _xml = new XML(e.target.data);
         //trace(_xml);
         // A partir de aqui ya puedes utilizar _xml      
         // en cualquier punto del programa         
    //Ese trace funciona perfecto como se esperaria
      }
      public function get elXML():XML {
         return _xml;
//esto retorna un null :(
      }



      
   }
}


O sea, hubiese querido hacer un:

var mivariable:retornaXML = new retornaXML();
trace(mivariable.elXML);
Pero retorna obviamente un null :(. Alguna idea?

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 29 Ene 2008 06:19 pm
tienes que esperar a que carguen los datos por completo, el hecho de que mandes llamar el método cargarXML() en el constructor, no quiere decir que de inmediato estará cargado el .xml, si mal no recuerdo, hay una variable booleana que indica si ya esta cargado el documento

Por master_of_puppetz

Claber

2483 de clabLevel

7 tutoriales
3 articulos

Genero:Masculino   Premio_Secretos

WebDev (Flex + PHP + JS)

firefox
Citar            
MensajeEscrito el 29 Ene 2008 06:36 pm

master_of_puppetz escribió:

tienes que esperar a que carguen los datos por completo, el hecho de que mandes llamar el método cargarXML() en el constructor, no quiere decir que de inmediato estará cargado el .xml, si mal no recuerdo, hay una variable booleana que indica si ya esta cargado el documento


Gracias por contestar. Claro, suponia que el tema era que aun no estaba cargado. Me pasaba algo similar con la llamada a un webservice, donde no me quedo otra que incluir toda la logica que necesitaba tomar del webservice dentro de la que aca seria la funcion 'xmlLoaded'.
A que boolean te referis? De que objeto? Donde lo viste? Donde podria consultar?
Si pudiera acceder a estas funciones encapsulandolas en una clase (tal como el ejemplo) me seria mucho mas eficiente, pero no encuentro como. Alguna idea?

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 29 Ene 2008 07:03 pm
perdón, pero olvidé que quitaron esa propiedad en el AS3, pero lo que puedes hacer, es agregar otro Listener a tu loader, pones el de progress y ahí vas checando el progreso, mientras que bytesLoaded < bytesTotal pones una bandera en falso, cuando bytesLoaded >= bytesTotal, la puedes poner en verdadero y entonces si ya sabras que el archivo .xml ha sido cargado

Todo esto lo puedes consultar en la ayuda de Flash/Flex, en los apartados de Referencia de Lenguaje (Language Reference)

Por master_of_puppetz

Claber

2483 de clabLevel

7 tutoriales
3 articulos

Genero:Masculino   Premio_Secretos

WebDev (Flex + PHP + JS)

firefox
Citar            
MensajeEscrito el 29 Ene 2008 09:32 pm
Gracias otra vez!
Bueno, ahora con ProgressEvent.PROGRESS es otra cosa. Estoy tratando de acceder a bytesLoaded asi, dentro de xmlLoaded:

Código :

trace(e.bytesLoaded);

Si lo compilo con la opcion de strict sin marcar, funciona. Ya que SUPONGO que me permite la conversion de 'e' a no se que tipo que soporta bytesLoaded. Ahora si trato de compilarlo con strict, no me lo permite. Supongo que deberia castear 'e' a algo antes, no? Pero a que?
Algo asi?

Código :

trace("esto son bytes?" + (e as Object).bytesLoaded); 

Esto funciona, porque supongo que 'lo que sea' como en otros lenguajes hereda de Object. Pero que seria 'e' en este caso? Probe con 'Event' pero me da error.

Se que seria 'hilar fino', pero la idea es aprender o no?

Gracias!

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 29 Ene 2008 09:52 pm
'e' en xmlLoaded, es Event, el otro 'e' es ProgressEvent

Por master_of_puppetz

Claber

2483 de clabLevel

7 tutoriales
3 articulos

Genero:Masculino   Premio_Secretos

WebDev (Flex + PHP + JS)

firefox
Citar            
MensajeEscrito el 30 Ene 2008 01:44 am
D'ough! (diria Homero). Es cierto, habia copiado la funcion anterior tal como la tenia y por eso necesitaba el cast. Mi error.

Ahora, en el XmlLoaded2 (listener del event ProgressEvent) tengo esto:

Código :

if (e.bytesLoaded >= e.bytesTotal) {
            _xml = new XML(e.target.data);
variableflag = true;
trace("se cargo");
         } else {
trace("no se cargo");
variableflag = false;         
         }


En realidad ahi siempre responde que se cargo. Supongo que porque el archivo XML es de poco tamaño.
Sin embargo, instanciando la clase en el FLA y tratando acceder a un metodo que deberia devolverme el xml tal como quisiera hacerlo, no funciona, devuelve null. Asi:
var miclase:retornaXML = new retornaXML;
trace("elXML:" + miclase.elXML);


hasta ahora mi codigo seria mas o menos asi:

Código :

package {
   import flash.net.URLRequest;
   import flash.net.URLLoader;
   import flash.events.*;
   import flash.events.ProgressEvent;
   public class retornaXML {
      private var _xml:XML = new XML();
      private var variableflag:Boolean = false;
      public function retornaXML() {
         cargarXML();
      }
      private function cargarXML():void {
         var loader:URLLoader = new URLLoader();
         loader.addEventListener(Event.COMPLETE, xmlLoaded);
         loader.addEventListener(ProgressEvent.PROGRESS, xmlLoaded2);
         loader.load(new URLRequest("LocalData.xml"));
      }
      private function xmlLoaded(e:Event):void {
         _xml = new XML(e.target.data);
         trace("trace en loaded: " + _xml);
         // A partir de aqui ya puedes utilizar _xml      
         // en cualquier punto del programa             
      }
      private function xmlLoaded2(e:ProgressEvent):void {
         //_xml = new XML(e.target.data);
         trace("trace en el progress: " + e);
         if (e.bytesLoaded >= e.bytesTotal) {
            _xml = new XML(e.target.data);
         } else {
trace("no se cargo");
variableflag = false;
                  }
      
      }
      public function get elXML():XML {
         return _xml;
//aca deberia chequear el flag? y volver a llamar la funcion si es false? como?
      }
   }
}


Si me pueden dar otra mano, eternamente agradecido.

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.