1

由于 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

4 回答 4

3

您可以扩展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;
于 2012-03-31T10:11:54.197 回答
2

你可以使用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();
}
于 2012-03-31T09:03:11.067 回答
1

为什么不直接使用 HTTPService,它允许您使用 AsyncToken 来确定哪个初始调用导致哪个初始结果?这样,您不必在调用之间等待(这意味着性能下降。)这是一些关于它如何与 Remoting 一起使用的文档,类似于http://flexdiary.blogspot.com/2008/11/more -thoughts-on-remoting.html。使用 HttpService,您可以通过 send() 方法取回令牌。

于 2012-03-31T20:52:47.007 回答
1

您可以依次加载每个 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_counterUrlLoader

onComplete()事件处理程序被调用时,它将URLLoader对象加载的数据推送到一个名为_data. 最后一个 if 语句检查是否所有的 url 都已加载,如果没有,它增加计数器,如果是,它执行应用程序中的其余代码,在这种情况下trace("complete");

于 2012-03-31T11:29:28.670 回答