Comunidad de diseño web y desarrollo en internet online

Saltar error en URLRequest - AIR

Citar            
MensajeEscrito el 23 Jun 2010 05:41 pm
Buenas gente, estoy lidiando con un problema y quiero ver si es posible encontrarle una solucion:

Estoy cargando varios archivos XML dentro de un ciclo while. Pero como los XML no dependen de mi, es posible que alguno no esté disponible. Cuando eso sucede, el compilador me da un error cuando no encuentra el XML y deja de cargar el resto de los archivos de la lista.
Existe la posibilidad de saltarse o de no prestarle atencion a dicho error y que se continuen cargando el resto de los archivos en la lista?

Un abrazo y gracias.

Por dave73

985 de clabLevel

5 tutoriales

 

Argentina, Córdoba

chrome
Citar            
MensajeEscrito el 23 Jun 2010 08:48 pm
Hola,
tienes que capturar el error de carga usando IOErrorEvent y un listener. Ejemplo:

Código ActionScript :

var urlRequest:URLRequest = new URLRequest("data.xml");
var urlLoader:URLLoader = new URLLoader(urlRequest);
urlLoader.addEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, urlLoaderErrorHandler);

function urlLoaderCompleteHandler(event:Event):void
{
   trace("Carga con éxito");
}

function urlLoaderErrorHandler(event:IOErrorEvent):void
{
   trace(event);
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Jun 2010 02:53 pm
Hola Isidoro, gracias por responder. Te cuento, ya habia hecho eso que mencionaste, dejó de salir el error de compilacion, pero aun asi no carga el resto de los archivos. Yo estoy cargando un XML y parseandolo en un array. Estimo que a pesar de que no pudo cargar el XML, igual asigna el array y por ende lo hace vacio. Luego, cuando manipulo el array mas adelante el codigo se queda sin responder, ya que el array que le estoy pasando está vacio. Esa es mi hipótesis hasta ahora. Supongo que tendré que hacer alguna bandera entre el ErrorEvent y el EventComplete.

Por dave73

985 de clabLevel

5 tutoriales

 

Argentina, Córdoba

chrome
Citar            
MensajeEscrito el 24 Jun 2010 04:24 pm
Puedes ir cargando los xml secuencialmente:

Código ActionScript :

var urls:Array = [ "file0.xml", "file1.xml", "file2.xml", "file3.xml", "file4.xml", "file5.xml" ];
var datas:Array = [];
var counter:uint = 0;

var urlRequest:URLRequest;
var urlLoader:URLLoader;
createLoader(urls[0]);

function createLoader(fileName:String):void
{
   if (counter == urls.length)
   {
      xmlLoadComplete();
      return;
   }
   urlRequest = new URLRequest(fileName);
   urlLoader = new URLLoader(urlRequest);
   urlLoader.addEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
   urlLoader.addEventListener(IOErrorEvent.IO_ERROR, urlLoaderErrorHandler);
}

function xmlLoadComplete():void
{
   trace(datas);
}

function urlLoaderCompleteHandler(event:Event):void
{
   event.target.removeEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
   event.target.removeEventListener(IOErrorEvent.IO_ERROR, urlLoaderErrorHandler);
   var urlL:URLLoader = event.target as URLLoader;
   datas.push(urlL.data);
   createLoader(urls[++counter]);
}

function urlLoaderErrorHandler(event:IOErrorEvent):void
{
   event.target.removeEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
   event.target.removeEventListener(IOErrorEvent.IO_ERROR, urlLoaderErrorHandler);
   createLoader(urls[++counter]);
}

O si prefieres cargar todos los archivos a la vez, e ir contando los que se cargan correctamente y los que no:

Código ActionScript :

var urls:Array = [ "file0.xml", "file1.xml", "file2.xml", "file3.xml", "file4.xml", "file5.xml" ];
var datas:Array = [];
var counter:uint = 0;

for (var i:uint = 0; i < urls.length; i++)
{
   var urlRequest:URLRequest = new URLRequest(urls[i]);
   var urlLoader:URLLoader = new URLLoader(urlRequest);
   urlLoader.addEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
   urlLoader.addEventListener(IOErrorEvent.IO_ERROR, urlLoaderErrorHandler);
}

function xmlLoadComplete():void
{
   trace(datas);
}

function urlLoaderCompleteHandler(event:Event):void
{
   event.target.removeEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
   event.target.removeEventListener(IOErrorEvent.IO_ERROR, urlLoaderErrorHandler);
   var urlL:URLLoader = event.target as URLLoader;
   datas.push(urlL.data);
   if (++counter == urls.length) xmlLoadComplete();
}

function urlLoaderErrorHandler(event:IOErrorEvent):void
{
   event.target.removeEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
   event.target.removeEventListener(IOErrorEvent.IO_ERROR, urlLoaderErrorHandler);
   if (++counter == urls.length) xmlLoadComplete();
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Jun 2010 05:58 pm
Hola Isidoro, asi lo hice! Bah, se hizo solo, dejame que me explique más:

Yo tenia un ciclo while, adentro definia los objetos URLLoader y URLRequest y les asiganaba Listeners. Las funciones que corrian del listener, usaban unas banderas. Pero descubri que Flash, primero tira todos los Requests y despues, en orden de carga o de respuesta del servidor, empieza a evaluar los listeners.

Asique, basandome en eso, pude resolverlo. Muchas gracias por tu ayuda Isidoro!

Por dave73

985 de clabLevel

5 tutoriales

 

Argentina, Córdoba

chrome
Citar            
MensajeEscrito el 25 Jun 2010 07:51 am
Claro, eso que has hecho con el while es lo mismo que te he puesto en el segundo código usando un for. De este modo las órdenes de carga se envían a la vez, y la colocación de los datos de los xml dependerá del orden en el que se hayan ido completando las descargas.
El primer código sería para un caso en el que necesites que los xml se carguen en un orden específico. Por ejemplo si la forma de tratar los datos del segundo xml cargado dependiesen de alguna variable extraída del primer xml, no podrías permitir que la carga del segundo terminase antes que la del primero.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox

 

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