actionscript-3 - listas - url loader para que sirve
URLLoader carga varios archivos y el orden de los resultados es el mismo que la carga de la llamada() (4)
Dado que URLLoader es asíncrono, ¿cómo asegurarse de que el orden de los datos del lado del servidor sea el mismo que el de la llamada loader.load ()? En otras palabras, ¿el orden de los datos en totalResults es el mismo orden del contenido relacionado con la url?
Lo siguiente es un fragmento de código:
1.for each(var url in urls) {
loadData(url);
}
2.private function loadData(url:String):void {
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, completeHandler);
var request:URLRequest = new URLRequest(url);
urlLoader.load(request);
}
3.private function completeHandler(event:Event):void {
var loader:URLLoader = URLLoader(event.target);
var result:Object = loader.data;
totalResults.push(result);// suppose totalResults is Array and a property in the class.
}
¿Por qué no usar HTTPService, que le permite usar AsyncToken para determinar qué llamada inicial resultó en qué resultado inicial? De esta manera, no tiene que esperar entre llamadas (con la degradación del rendimiento que eso implica). Aquí hay documentación sobre cómo funciona con Remoting, que es similar http://flexdiary.blogspot.com/2008/11/more -thoughts-on-remoting.html . Con HttpService, recuperas el token como resultado del método send ().
Puede cargar cada url secuencialmente una tras otra en orden como en el siguiente ejemplo:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
public class Main extends Sprite
{
private var _urls:Vector.<String>;
private var _counter:int;
private var _data:Array;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
_urls = Vector.<String>(["text1.txt", "text2.txt", "text3.txt" ]);
_counter = 0;
_data = [];
loadNext();
}// end function
private function loadNext():void
{
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, onComplete);
urlLoader.load(new URLRequest(_urls[_counter]));
}// end function
private function onComplete(event:Event):void
{
_data.push((event.target as URLLoader).data);
if (_counter++ == (_urls.length - 1)) trace("complete");
else loadNext();
}// end function
}// end class
}// end package
Los métodos loadNext()
y onComplete()
actúan como un bucle. Cuando se loadNext()
se loadNext()
una instancia de un objeto URLLoader
y se carga una url en el Vector.<String>
object _urls
. Utiliza el objeto _counter
como un contador que se incrementa con el UrlLoader
"completo" de cada objeto UrlLoader
.
Cuando se llama al controlador de eventos onComplete()
, empuja los datos cargados por el objeto URLLoader
a una matriz llamada _data
. Finalmente, una instrucción if comprueba si todas las URL se han cargado, de lo contrario, incrementa el contador, si es así, ejecuta el resto del código en la aplicación, en este caso, trace("complete");
.
Puede extender la funcionalidad de la clase URLLoader
.
dynamic class DynamicURLLoader extends URLLoader { }
Luego guarde los datos (en su caso, probablemente index
) en el objeto cargador, antes de solicitar:
var urlLoader:DynamicURLLoader = new DynamicURLLoader();
urlLoader.index = ...
Después de la respuesta, recupere esa información (en su index
caso):
var loader:DynamicURLLoader = DynamicURLLoader(event.target);
totalResults[ loader.index ] = loader.data;
puedes usar BulkLoader , tiene este built -in. o tiene que crear su propia cola, donde un archivo se carga después del otro.
fragmento de código:
0.var queue:Array, totalResults:Array = [];
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, completeHandler);
1.for each(var url in urls) {
loadData(url);
}
2.private function loadData(url:String):void {
var request:URLRequest = new URLRequest(url);
queue.push(request);
}
3.private function doQueue() {
if (queue.length > 0) {
var arr:Array = queue.splice(0,1);
var req:URLRequest = arr[0] as URLRequest;
urlLoader.load(req);
}
else {
// queue done !
trace(totalResults);
}
}
4.private function completeHandler(event:Event):void {
var loader:URLLoader = URLLoader(event.target);
var result:Object = loader.data;
totalResults.push(result);// suppose totalResults is Array and a property in the class.
doQueue();
}