Немного (!) Фона, прежде чем я смогу добраться до вопроса:
У меня есть гармошка, загруженная массивом сеток, каждая из которых лениво загружена массивами вещей. Я использую автоматически сгенерированный прокси веб-службы для получения этих списков. Я бы хотел, чтобы пользователь мог изменить выбранного ребенка в аккордеоне, не дожидаясь ответа веб-службы. Первоначально я использовал один и тот же экземпляр прокси-сервера для всех запросов и отслеживания запросов в том порядке, в котором они были сделаны, но проблема в том, что более короткие массивы возвращаются с сервера быстрее, поэтому порядок выполнения запросов становится неактуальным .
Я не смог найти очевидный способ определить исходный запрос при обработке результирующего события прокси, так что в итоге я получил функцию, которая обрабатывает событие change на гармошке, создает новый прокси-сервер веб-службы и помещает его в hashtable с индексом выбранного дочернего элемента, а затем добавляет замыкание в качестве обработчика события. то есть что-то вроде этого:
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);
}
(Я пытался немного анонимизировать, так что, возможно, я что-то упустил, но, надеюсь, вы поняли)
Итак, на вопрос (ы): есть ли более простой способ сопоставить результаты прокси с исходными запросами, которые я просто пропускаю?
Если нет, то что я сделал разумно? Меня немного беспокоит количество прокси-экземпляров, которые я мог бы в конечном итоге генерировать, а затем корректно их утилизировать (когда это становится необходимым) - есть ли какие-либо подводные камни, о которых я мог не знать?
Обновление:
Я думаю, что проблема может возникнуть, потому что сгенерированный прокси-код подклассов ResultEvents из flash.events.Event, а не mx.rpc.events.ResultEvent. Я не совсем уверен, почему он это делает - единственный способ получить доступ к AsyncToken - это когда он изначально возвращается вызовом метода.