在我回答这个问题之前有一点(!)一点背景知识:
我有一个加载了网格数组的 Accordion 控件,每个网格都是延迟加载的东西数组。我正在使用自动生成的 Web 服务代理来检索这些列表。我希望用户能够更改 Accordion 中选定的子项,而无需等待 Web 服务响应。我最初对所有请求使用相同的代理实例,并按照发出的顺序跟踪请求,但这样做的问题是较短的数组从服务器返回的速度更快,因此发出请求的顺序变得无关紧要.
在处理代理结果事件时,我找不到确定原始请求的明显方法,所以我最终得到的是一个函数,它处理 Accordion 上的更改事件,实例化一个新的 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 的唯一方法是在方法调用最初返回它时。
最佳答案
不确定这是否有帮助,但我有类似的情况,我有一个 RemoteObject,我在其上调用 4 个 CRUD 方法,但只有一个 resultHandler。我使用 AsyncToken
解决了这个问题。
我的 RemoteObject 调用如下所示:
public function list() {
var token:AsyncToken = myService.list();
token.operation = "list";
}
public function update() {
var token:AsyncToken = myService.update(selectedItem);
token.operation = "update";
}
public function create() {
var token:AsyncToken = myService.create(selectedItem);
token.operation = "create";
}
public function delete() {
var token:AsyncToken = myService.delete(selectedItem);
token.operation = "delete";
}
然后,resultHandler
看起来像这样:
public function resultHandler(event:ResultEvent):void {
if( event.token.operation == "list" ) {
// do something
} else if( event.token.operation == "update" ) {
// do something
}
// etc...
operation
是动态属性,不是 AsyncToken 的成员,所以你可以随意调用它。
有一篇 Cookbook 文章描述了它 here :
关于apache-flex - 将 Web 服务结果与 Flex 中的请求匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/468669/