4

我有几个远程对象方法,我想根据上下文以不同的方式响应它们,但我宁愿不设置一堆不同的 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");

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

4

6 回答 6

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();

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

于 2009-11-09T19:07:00.420 回答
2

这是一个很好的例子,它使用 AsyncToken 和 RemoteObject 方法调用来精确地做你需要的事情。

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

于 2009-09-02T19:19:04.297 回答
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”实例希望它有意义。

于 2011-03-29T07:17:26.460 回答
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>

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

于 2009-07-11T23:46:17.250 回答
0

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

于 2009-09-02T19:12:04.357 回答
0

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

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

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

于 2009-09-03T12:55:42.657 回答