将Web服务结果与Flex中的请求进行匹配

inf*_*ris 3 apache-flex actionscript asynchronous web-services

在我得到问题之前,有点(!)的背景知识:

我有一个手风琴控件加载了一个网格数组,每个网格都是延迟加载的数组.我正在使用自动生成的Web服务代理来检索这些列表.我希望用户能够更改手风琴中选定的孩子而无需等待Web服务响应.我最初对所有请求使用相同的代理实例,并按照它们的顺序跟踪请求,但问题是较短的数组从服务器返回得更快,因此请求的顺序变得无关紧要.

在处理代理结果事件时,我找不到一种明确的方法来确定原始请求,所以我最终得到的是一个处理手风琴上的change事件的函数,实例化一个新的webservice代理,将其推送到哈希表中.所选子项的索引,然后添加一个闭包作为事件处理程序.即有点像这样的东西:

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);
}
Run Code Online (Sandbox Code Playgroud)

(我试图对此进行匿名处理,所以我可能错过了一些东西,但希望你能得到这个想法)

那么,对于问题:是否有更简单的方法将代理结果与我刚刚遗漏的原始请求相匹配?

如果没有,我做得合理吗?我有点担心代理实例的数量,我可以最终生成然后正确处理它们(当有必要时) - 是否有任何我可能不知道的陷阱?

更新: 我认为问题可能出现,因为生成的代理代码从flash.events.Event而不是mx.rpc.events.ResultEvent继承ResultEvents.我不完全确定它为什么这样做 - 访问AsyncToken的唯一方法是它最初由方法调用返回.

Mik*_*ler 8

不确定这是否有帮助,但我有类似的情况,我有一个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";
}
Run Code Online (Sandbox Code Playgroud)

然后,resultHandler看起来像这样:

public function resultHandler(event:ResultEvent):void {
    if( event.token.operation == "list" ) {
      // do something
    }   else if( event.token.operation == "update" ) {
    // do something
    }   
    // etc...
Run Code Online (Sandbox Code Playgroud)

operation是一个动态属性,不是AsyncToken的成员,因此您可以随意调用它.有描述它一个食谱的文章在这里: