質問に入る前に、少し (!) 背景を説明します。
グリッドの配列がロードされたアコーディオン コントロールがあり、それぞれが物事の配列で遅延ロードされます。これらのリストを取得するために、自動生成された Web サービス プロキシを使用しています。Web サービスの応答を待たずに、ユーザーがアコーディオンで選択した子を変更できるようにしたいと考えています。私は元々、すべてのリクエストに同じプロキシ インスタンスを使用し、リクエストを作成された順序で追跡していましたが、これの問題は、配列が短いほどサーバーからより迅速に返されるため、リクエストが作成された順序が無関係になることです。 .
プロキシ結果イベントを処理するときに元のリクエストを特定する明白な方法を見つけることができなかったので、最終的には、アコーディオンの変更イベントを処理し、新しい Web サービス プロキシをインスタンス化し、それをハッシュテーブルに押し込む関数になりました。選択した子のインデックスを作成し、クロージャーをイベント ハンドラーとして追加します。つまり、次のようなものです。
private proxyTable:Object = new Object();
private function PopulateThingGrid(index:Number):void
{
var grid:ThingGrid = myAccordion.getChildAt(index) as ThingGrid;
grid.things = ArrayCollection(proxyTable[index].getThings_lastResult);
}
private function SendThingRequest(index:int):void
{
var grid:ThingGrid= myAccordion.getChildAt(index) as ThingGrid;
if (grid.things.length == 0)
{
if (proxyTable[index] == null)
{
proxyTable[index] = new MyWebServiceProxy();
}
var proxy:MyWebServiceProxy= proxyTable[index];
proxy.addgetThingsEventListener(function ():void { PopulateThingGrid(index); });
var list:ThingList = thingLists.getItemAt(index) as ThingList;
proxy.getThings("thinglist", list.ListID);
}
}
private function myAccordion_Change(event:IndexChangedEvent):void
{
SendThingRequest(event.newIndex);
}
(これを少し匿名化しようとしたので、何かを見落としているかもしれませんが、うまくいけばアイデアが得られます)
それで、質問に:プロキシの結果を、私が見逃している元のリクエストと一致させる簡単な方法はありますか?
そうでない場合、私が行ったことは合理的ですか?最終的に生成してからそれらを正しく破棄する可能性のあるプロキシ インスタンスの数について少し心配しています (それが必要になった場合)。
更新: 生成されたプロキシ コードが、mx.rpc.events.ResultEvent ではなく、flash.events.Event から ResultEvents をサブクラス化するため、問題が発生する可能性があると思います。なぜこれを行うのか完全にはわかりません.AsyncTokenにアクセスする唯一の方法は、メソッド呼び出しによって最初に返されたときです.