Flex RemoteObject - 处理多个请求

时间:2009-07-11 23:36:47

标签: flex blazeds remoteobject

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

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

<mx:RemoteObject id="rpt" destination="AMFServer">
  <mx:method name="getSalesStats" fault="getSalesStatsFault(event)" 
    result = "getSalesStatsSuccess(event)" />
</mx:RemoteObject>

getSalesStats方法将员工ID和销售类型作为其参数。你会这样称呼:

rpt.getSalesStats(120, "peanuts");

public function getSalesStatsSuccess(e:ResultEvent):void {
   salesdata:ArrayCollection = e.result.rows as ArrayCollection; 
   salesGraph.dataProvider = salesdata; 
   salesGraphPanel.title = "Peanut Sales, 1990";
}

我希望能够在不同的上下文中调用此方法,有时将结果发送到图表,有时发送到数据网格;我希望能够根据用户的需要更改图表的标题和类型。我想要的一些东西可以通过评估从服务器返回的数据来实现;该对象包含报告名称,因此我可以评估该值。但有些事情需要改变,而不仅仅是我从服务器回来的东西。如果这是同步通话,那将很容易;我会做类似的事情:

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

function buttonTwoClick():void {
   myData2:ArrayCollection = getSalesStats(120, "cashews");
   myDataGrid.dataProvider = myData2; 
}

我想通过远程方法将某些内容传递给响应函数,例如:

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

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

6 个答案:

答案 0 :(得分:2)

Here is a great example of using AsyncToken with RemoteObject method calls准确地完成您的需要。

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

答案 1 :(得分:2)

在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)"/>

要进行调用,请将方法调用中返回的AsyncToken分配给响应者的token属性:

toDataGridResponder.token = rpt.getSalesStats();

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

答案 2 :(得分:0)

您可以为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>

你有什么理由不能使用这样的东西吗?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

  • 为每个调用上下文都有一个单独的远程对象。对性能的影响可以忽略IMO。
  • 将remoteobject的并发性设置为单个(或者首先,不确定名称,但不是多个或最后一个),并且可以使用某种标志来判断哪个是最后一个调用的方法。当然,这将在此远程对象上将服务器调用限制为一次。如果之前的呼叫尚未返回结果,则呼叫将立即失败。

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

答案 5 :(得分:0)

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”实例 希望它有意义。