2009-07-11 3 views
4

Ich habe ein paar Remote-Objektmethoden, auf die ich je nach Kontext unterschiedlich reagieren möchte, aber ich würde lieber nicht eine Reihe von verschiedenen RemoteObject-Aliasen einrichten. Irgendwelche Ratschläge dazu? Etwas Hintergrund:Flex RemoteObject - Behandlung mehrerer Anfragen

Angenommen, ich habe eine Admin-Anwendung, die Verkaufsstatistiken auf verschiedene Arten anzeigt. Die Remotemethode sieht folgendermaßen aus:

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

Die Methode getSalesStats verwendet eine Mitarbeiter-ID und einen Verkaufstyp als Argumente. Sie würden es nennen mag:

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

Ich möchte in verschiedenen Kontexten zum Aufrufen dieser Methode in der Lage sein, manchmal das Ergebnis in ein Diagramm zu senden und manchmal zu einem Datagrid; Ich möchte in der Lage sein, den Titel und den Typ des Diagramms je nach den Wünschen des Benutzers zu ändern. Etwas von dem, was ich will, kann erreicht werden, indem man die vom Server zurückgegebenen Daten auswertet; Das Objekt enthält den Berichtsnamen, sodass ich diesen Wert auswerten kann. Aber einige Dinge müssen sich ändern, basierend auf mehr als nur, was ich vom Server bekomme. Wenn dies ein synchroner Anruf wäre, wäre es einfach; Ich würde so etwas wie:

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

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

Ich mag würde etwas durch die Remote-Methode, um die Reaktion Funktion zu übergeben, wie:

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

aber natürlich wirft einen Fehler, da der Server doesn Ich will das letzte Argument nicht. Irgendwelche Gedanken? Ich werde klären, ob das verwirrend ist.

Antwort

0

Sie können mehrere Methoden zu einem remoteObject haben.

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

Gibt es einen Grund, warum Sie so etwas nicht verwenden können?

+0

Ich würde antworten, dass ich nicht viel Kontrolle über den serverseitigen Java-Code habe, aber natürlich sind diese Methoden nur die AMF-Gateway-Aliase, also könnte ich eine Menge davon erstellen. der Einfachheit halber könnte ich sie alle an die gleiche Ergebnisfunktion senden und evaluieren event.target.name, um zu sehen, welche Methode aufgerufen wurde. Das könnte die Dinge überschaubar halten, da es viele Benutzerinteraktionskombinationen geben wird, also viele dieser Methoden. – SkippyFlipjack

0

Flex unterstützt das Asynchronous Completion Token-Entwurfsmuster für die Verarbeitung mehrerer Anforderungen an denselben Dienst. Siehe die BlazeDS documentation.

2

Here is a great example of using AsyncToken with RemoteObject method calls genau das zu tun, was Sie brauchen.

Etwas im Auge zu behalten, wenn Sie AsyncToken verwenden, ist, dass es ein dynamische Objekt ist und Sie eine Eigenschaft hinzufügen, können Sie es möchten. Das Ereignis in Ihrer Respondermethode enthält einen Verweis auf AsyncToken und Sie können auf Ihre dynamischen Eigenschaften zugreifen, um den Kontext der Antwort zu identifizieren.

0

Ich denke, es gibt nur zwei Möglichkeiten, dies zu tun:

  • Haben Sie ein separates Remote-Objekt für jeden Anruf Kontext. Der Effekt auf die Leistung ist vernachlässigbar IMO.
  • Setzen Sie die Parallelität für das remoteobject auf single (oder ersten, nicht sicher über den Namen, aber nicht mehrere oder letzte) und haben eine Art von Flag, die Sie verwenden können, um zu sagen, war die zuletzt genannte Methode. Dadurch werden die Serveraufrufe auf dieses Remote-Objekt natürlich auf eins beschränkt. Anrufe werden sofort fehlschlagen, wenn der vorherige Anruf noch kein Ergebnis zurückgegeben hat.

Das ist die einzige Möglichkeit, die ich sehe, wenn Sie keinen Zugriff auf den Server haben. Wenn ich in Ihrer Situation war, werde ich sogar das entfernte Objekt jedes Mal erstellen, wenn ich den Remoteanruf mache. Ich glaube nicht, dass dies die Leistung beeinträchtigt (bitte korrigiere mich, wenn ich falsch liege). Viel Glück!

2

In Flex 4 und 3,4, verwenden, um die Callresponder Klasse:

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

Um den Anruf zu machen, weisen die zurück AsyncToken aus dem Methodenaufruf an die Token-Eigenschaft des Responders:

toDataGridResponder.token = rpt.getSalesStats(); 

Dadurch wird die Antwortdefinition vom Methodenaufruf getrennt und Sie können sie dann in die von Ihnen benötigte Logik umbrechen.

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“ Instanz von RemoteObject- Hoffe, dass es Sinn macht.

Verwandte Themen