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を使用することもできます-このビルトインがあります。または、独自のキューを作成する必要があります。この場合、1つのファイルが次々にロードされます。

コードスニペット:

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

次の例のように、各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 に答える
1

HTTPServiceを使用しないのはなぜですか。これにより、AsyncTokenを使用して、どの初期呼び出しがどの初期結果につながったかを判別できます。そうすれば、呼び出しの合間に待つ必要はありません(パフォーマンスの低下を意味します)。これは、Remotingでどのように機能するかについてのドキュメントです。これはhttp://flexdiary.blogspot.com/2008/11/moreに似ています。 -thoughts-on-remoting.html。HttpServiceを使用すると、send()メソッドの結果としてトークンを取得できます。

于 2012-03-31T20:52:47.007 に答える