2009-07-11 63 views
4

我有幾個遠程對象方法,我想以不同的方式響應不同的上下文,但我寧願不設置一堆不同的RemoteObject別名。有關這樣做的任何建議?一些背景:Flex 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"; 
} 

我希望能夠調用在不同環境下這種方法,有時將結果發送到一個圖表,有時一個DataGrid;我希望能夠根據用戶需要更改圖表的標題和類型。我想要的一些東西可以通過評估從服務器返回的數據來實現;該對象包含報告名稱,所以我可以評估該值。但有些事情需要根據不止是從服務器返回的內容進行更改。如果這是一個同步呼叫,那很容易;我會做這樣的事情:

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

,但因爲服務器沒有按那當然會引發錯誤我不想要最後一個論點。有什麼想法嗎?我會澄清,如果這是令人困惑的..

回答

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> 

你有什麼理由不能使用這樣的東西嗎?

+0

我打算回覆說,我對服務器端Java代碼沒有太多的控制權,但當然這些方法只是AMF網關別名,所以我可以創建一堆這樣的代碼。 爲了簡單起見,我可以將它們全部發送給相同的結果函數並評估event.target.name以查看調用哪個方法。這可能會讓事情易於管理,因爲會有很多用戶交互組合,所以很多這些方法.. – SkippyFlipjack 2009-07-12 00:31:46

0

Flex支持用於處理對同一服務的多個請求的異步完成令牌設計模式。請參閱BlazeDS documentation

0

我認爲只有兩種方法可以做到這一點:

  • 對每個調用上下文獨立的遠程對象。對性能的影響是可忽略的IMO。
  • 設置遠程對象的併發性爲單個(或者第一個,不確定名稱,但不是多個或最後一個),並且有一些標誌可以用來判斷哪個是最後調用的方法。這當然會將服務器調用限制在這個遠程對象上。如果先前的呼叫尚未返回結果,呼叫將立即失敗。

這是我看到它的唯一方法,如果您無法訪問服務器。如果我處於您的情況,我甚至會在每次進行遠程呼叫時創建遠程對象。我不認爲這會影響表現(如果我錯了,請糾正我)。祝你好運!

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到響應的令牌屬性:

toDataGridResponder.token = rpt.getSalesStats(); 

這將方法調用的響應定義分開,然後您可以將其包裝在您所需的任何邏輯中。

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

「remoteService」 的RemoteObject 的情況下希望它纔有意義。