URLLoader загружает несколько файлов, и порядок следования такой же, как и при вызове load () - PullRequest
1 голос
/ 31 марта 2012

Поскольку 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 ]

3 голосов
/ 31 марта 2012

Вы можете расширить 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;
2 голосов
/ 31 марта 2012

вы можете использовать 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();
}
1 голос
/ 01 апреля 2012

Почему бы просто не использовать HTTPService, который позволяет использовать AsyncToken, чтобы определить, какой начальный вызов привел к какому начальному результату?Таким образом, вам не нужно ждать между вызовами (с ухудшением производительности, которое подразумевает.) Вот некоторая документация о том, как она работает с Remoting, которая похожа http://flexdiary.blogspot.com/2008/11/more-thoughts-on-remoting.html.С HttpService вы получаете токен в результате метода send ().

1 голос
/ 31 марта 2012

Вы можете загружать каждый 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 в качестве счетчика, который увеличивается на единицу при каждом событии "complete" объекта UrlLoader.

Когда вызывается обработчик события onComplete(), он помещает данные, загруженные объектом URLLoader, в массив с именем _data.Наконец, оператор if проверяет, были ли загружены все URL, если нет, он увеличивает счетчик, если это так, он выполняет остальную часть кода в приложении, в данном случае trace("complete");.

...