在我回答这个问题之前,有一点(!)一点背景知识:
我有一个装有网格数组的手风琴控件,每个网格都是延迟加载的东西数组。我正在使用自动生成的 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);
}
(我试着匿名了一点,所以我可能错过了一些东西,但希望你明白)
那么,对于问题:有没有一种更简单的方法可以将代理结果与我刚刚丢失的原始请求相匹配?
如果不是,我所做的是否合理?我有点担心我最终可能生成然后正确处理它们的代理实例的数量(当有必要时) - 有没有我可能不知道的陷阱?
更新: 我认为可能会出现问题,因为生成的代理代码从 flash.events.Event 子类化 ResultEvents,而不是 mx.rpc.events.ResultEvent。我不完全确定它为什么这样做 - 访问 AsyncToken 的唯一方法是它最初由方法调用返回。