Apache flex Flex RemoteObject-处理多个请求

Apache flex Flex RemoteObject-处理多个请求,apache-flex,blazeds,remoteobject,Apache Flex,Blazeds,Remoteobject,我有几个远程对象方法,我想根据上下文以不同的方式响应它们,但我不想设置一堆不同的远程对象别名。有什么建议吗?一些背景: 假设我有一个管理应用程序,它以不同的方式显示销售统计数据。远程方法如下所示: <mx:RemoteObject id="rpt" destination="AMFServer"> <mx:method name="getSalesStats" fault="getSalesStatsFault(event)" result = "getSales

我有几个远程对象方法,我想根据上下文以不同的方式响应它们,但我不想设置一堆不同的远程对象别名。有什么建议吗?一些背景:

假设我有一个管理应用程序,它以不同的方式显示销售统计数据。远程方法如下所示:

<mx:RemoteObject id="rpt" destination="AMFServer">
  <mx:method name="getSalesStats" fault="getSalesStatsFault(event)" 
    result = "getSalesStatsSuccess(event)" />
</mx:RemoteObject>
我希望能够在不同的上下文中调用此方法,有时将结果发送到图表,有时发送到数据网格;我希望能够根据用户的需要更改图表的标题和类型。我想要的一些东西可以通过评估服务器返回的数据来实现;对象包含报表名称,因此我可以计算该值。但是有些事情需要改变,不仅仅是因为我从服务器得到了什么。如果这是一个同步调用,那么就很容易了;我会这样做:

function buttonOneClick():void {
   myData1:ArrayCollection = getSalesStats(120, "peanuts");
   myChart.dataProvider = myData1;
}

function buttonTwoClick():void {
   myData2:ArrayCollection = getSalesStats(120, "cashews");
   myDataGrid.dataProvider = myData2; 
}
我想通过remote方法将一些内容传递给响应函数,如:

rpt.getSalesStats(120, "peanuts", "clicked button one");

但这当然会抛出一个错误,因为服务器不需要最后一个参数。有什么想法吗?我会澄清这是否令人困惑

一个remoteObject可以有多个方法

<mx:RemoteObject id="rpt" destination="AMFServer">
    <mx:method name="getSalesStatsToChart" fault="getSalesStatsFault(event)" 
        result = "getSalesStatsToChartSuccess(event)" />
    <mx:method name="getSalesStatsToDataGrid" fault="getSalesStatsFault(event)" 
        result = "getSalesStatsToDataGridSuccess(event)" />
</mx:RemoteObject>


有什么原因不能使用这种方式吗?

Flex支持异步完成令牌设计模式,用于处理对同一服务的多个请求。请参阅。

以精确执行您需要的操作


使用AsyncToken时需要记住的一点是,它是一个动态对象,您可以向它添加任何想要的属性。响应程序方法中的事件将包含对AsyncToken的引用,您可以访问动态属性以轻松识别响应的上下文。

我认为只有两种方法可以做到这一点:

  • 每个调用上下文都有一个单独的远程对象。对性能的影响是可以忽略的
  • 将remoteobject的并发性设置为single(或first,不确定名称,但不确定multiple或last),并具有某种标志,您可以使用该标志判断最后调用的方法是哪个方法。当然,这将限制此远程对象上的服务器调用一次只能调用一个。如果前一个调用尚未返回结果,调用将立即失败

如果您无法访问服务器,这是我看到它的唯一方式。如果我处于您的情况,我甚至会在每次执行远程调用时创建远程对象。我认为这不会影响性能(如果我错了,请纠正我)。祝你好运

在Flex 4和3.4中,使用CallResponder类:

<mx:RemoteObject id="rpt" destination="AMFServer"/>
<s:CallResponder id="toChartResponder" fault="getSalesStatsFault(event)" 
        result = "getSalesStatsToChartSuccess(event)" />
<s:CallResponder id="toDataGridResponder"fault="getSalesStatsFault(event)" 
        result = "getSalesStatsToDataGridSuccess(event)"/>

这将响应定义与方法调用分离,然后您可以将其封装在所需的任何逻辑中。

var rpcCall:AsyncToken

    rpcCall = remoteService.getSessionId();
    rpcCall.addResponder(new Responder(handler_getSessionIdSuccess, handler_getSessionIdFault) );

    rpcCall = remoteService.getMyData();
    rpcCall.addResponder(new Responder(handler_getMyDataSuccess, handlerfault));
remoteobject的“remoteService”实例
希望它会有意义。

我打算回答说,我对服务器端Java代码没有太多的控制权,但当然,这些方法只是AMF网关别名,所以我可以创建一组。为了简单起见,我可以将它们全部发送到相同的结果函数,并计算event.target.name以查看调用了哪个方法。这可能会使事情易于管理,因为将会有很多用户交互组合,所以这些方法很多。。
toDataGridResponder.token = rpt.getSalesStats();
    rpcCall = remoteService.getSessionId();
    rpcCall.addResponder(new Responder(handler_getSessionIdSuccess, handler_getSessionIdFault) );

    rpcCall = remoteService.getMyData();
    rpcCall.addResponder(new Responder(handler_getMyDataSuccess, handlerfault));