2009-07-11 12 views
4

コンテキストに応じて異なる方法で応答したいいくつかのリモートオブジェクトメソッドがありますが、別のRemoteObjectエイリアスを設定することはできません。それをするためのアドバイスは?背景:Flex 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"); 

をしかし、サーバーがdoesnのためのコースのことでエラーが発生しますその最後の議論が欲しい。何かご意見は?これが混乱しているかどうかを明確にします。

答えて

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

0

Flexは、同じサービスに対する複数の要求を処理するための非同期完了トークンデザインパターンをサポートしています。 BlazeDS documentationを参照してください。

2

Here is a great example of using AsyncToken with RemoteObject method callsあなたが必要とするものを正確に行う。

AsyncTokenを使用しているときは、という動的なオブジェクトであり、そのプロパティに任意のプロパティを追加できます。レスポンダメソッドのイベントはAsyncTokenへの参照を持ち、動的プロパティにアクセスしてレスポンスのコンテキストを簡単に識別できます。

0

私はこれを行うための唯一の2つの方法があると思います。

  • 各呼び出しコンテキストのための独立したリモートオブジェクトを持っています。パフォーマンスへの影響は無視できるIMOです。
  • リモートオブジェクトの並行性を単一(または、最初は、名前はわかりませんが、複数でも最後でもない)に設定し、最後に呼び出されたメソッドがどれかを示すために使用できるフラグをいくつか持っています。これはもちろん、このリモートオブジェクト上でサーバコールを1つずつ制限します。直前の呼び出しがまだ結果を返さなかった場合、呼び出しは直ちに失敗します。

サーバーにアクセスできない場合は、これが私には唯一の方法です。私があなたの状況にあったならば、私はリモートコールを行うたびにリモートオブジェクトを作成します。私はそれがパフォーマンスに影響するとは思わない(私が間違っている場合は私を修正してください)。がんばろう!

2
フレックス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; RemoteObjectの の

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

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

"remoteService" インスタンスは、それが意味をなすことを願っています。

関連する問題