URLLoader загружает несколько файлов и порядок следования такой же, как и при вызове load()
Поскольку URLLoader является асинхронным, как убедиться, что порядок данных со стороны сервера такой же, как и у вызова loader.load()? Другими словами, порядок данных в totalResults - это тот же порядок содержимого, относящегося к URL?
Ниже приведен фрагмент кода:
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.
}
4 ответа
Вы можете продлить URLLoader
функциональность класса.
dynamic class DynamicURLLoader extends URLLoader { }
Затем сохраните данные (в вашем случае, вероятно, index
) в объекте загрузчика, перед запросом:
var urlLoader:DynamicURLLoader = new DynamicURLLoader();
urlLoader.index = ...
После ответа получите эти данные (в вашем случае index
):
var loader:DynamicURLLoader = DynamicURLLoader(event.target);
totalResults[ loader.index ] = loader.data;
Вы можете использовать BulkLoader - он получил эту встроенную функцию. или вы должны создать свою собственную очередь, где один файл загружается за другим.
фрагмент кода:
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();
}
Почему бы просто не использовать HTTPService, который позволяет использовать AsyncToken, чтобы определить, какой начальный вызов привел к какому начальному результату? Таким образом, вам не нужно ждать между вызовами (с ухудшением производительности, которое подразумевает.) Вот некоторая документация о том, как это работает с Remoting, которая аналогична http://flexdiary.blogspot.com/2008/11/more-thoughts-on-remoting.html. С HttpService вы получаете токен в результате метода send().
Вы можете загружать каждый URL последовательно один за другим по порядку, как в следующем примере:
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
Методы loadNext()
а также onComplete()
действовать как петля. когда loadNext()
называется, URLLoader
объект создается и загружает URL в Vector.<String>
объект _urls
, Он использует _counter
объект в качестве счетчика, который увеличивается на каждый UrlLoader
"завершенное" событие объекта.
Когда onComplete()
вызывается обработчик события, он выталкивает данные, загруженные URLLoader
объект в массив под названием _data
, Наконец, оператор if проверяет, были ли загружены все URL-адреса, если нет, он увеличивает счетчик, если это так, он выполняет остальную часть кода в приложении, в этом случае trace("complete");
,