2010-12-27 10 views
0

In einem unserer Projekte verwenden wir Flex für Frontend, Blazeds/Java im Backend. Es ist ein bestehender Code, in dem Dienste vorgeschrieben werden. Ich muss im Backend 3 Dienste aufrufen (im Prinzip 3 Remote-Objekte) und ihr Ergebnis erhalten und das Ergebnis in einem Objekt speichern und die Daten dieses Objekts in einer Ansicht anzeigen. Jetzt im Frontend verwenden wir Flex und Petersilie Framework. Ich dachte an die folgenden Ansätze.Mehrere asynchrone Aufrufe zum Abrufen von Ergebnissen aus mehreren Diensten mit einem einzigen Klick auf eine Schaltfläche im Flex machen?

1) Befehle für jeden Serviceaufruf erstellen und das Ergebnis in einem gemeinsamen Objekt (Modell) speichern und dann dieses Modell in der Ansicht anzeigen. Bei diesem Ansatz besteht das Problem, dass einige Dienste in einigen anderen Webseiten benötigt werden, aber sie brauchen nicht das gleiche Modell. Wie soll ich mit diesem Szenario umgehen? Sollte ich einen asynchronen Remote-Aufruf durchführen und das Ergebnis abrufen und dann erneut versenden und das Ereignis mit dem Ereignisobjekt speichern, wird das Ergebnis gespeichert.

2) Einen Serviceanruf tätigen, auf das Ergebnis warten, dann einen weiteren Anruf tätigen und auf das Ergebnis warten und dann einen anderen Anruf tätigen, nicht sicher, ob dies der richtige Weg ist?

Was ist die beste Lösung, um ein Szenario wie dieses zu behandeln. Danke für Ihre Hilfe.

+1

Sind die drei Remote-Anrufe voneinander abhängig? Wenn ich das hier lese, bin ich mir nicht sicher, warum Sie nicht einfach die drei Anrufe mit drei Event-Handlern machen ... das klassische asynchrone Muster. –

Antwort

1

Also ich denke, ich bin immer noch verwirrt über das, was Ihr Problem ist, also werde ich einfach versuchen, es zu beantworten, indem ich die Vorgehensweise würde ich drei unabhängige Anrufe zu einem Backend machen würde.

Ich würde sie alle sofort nacheinander abfeuern. Da Back-End-Aufrufe in Flex immer asynchron sind, werden sie sofort zurückgegeben. Jeder dieser Aufrufe enthält eine Rückruffunktion für die Rückgabe des Ergebnisses. Also, in pseudo (ish) Code, wäre es so etwas wie diese:

makeRequest1(whenRequest1Finishes); 
makeRequest2(whenRequest2Finishes); 
makeRequest3(whenRequest3Finishes); 

In diesem Fall makeRequest* ist eine Methode, die weiß, was der Server/Mechanismus ist, den Anruf zu tätigen und zu einer Funktion zurückrufen Sie habe einen Ort namens whenRequest*Finishes definiert.

Angenommen, es gibt jetzt drei verschiedene Teile Ihrer Benutzeroberfläche, die getrennt von jeder dieser Anforderungen aktualisiert werden, würde ich diese Bereiche der Benutzeroberfläche füllen, wie sie kommen. Ich würde sie nicht einfach füllen, obwohl .. Ich würde dem Benutzer einen Hinweis geben, dass sie angekommen sind. Dies kann eine subtile Animation der Daten sein, die "fliegen", oder eine Warteanzeige, die verschwindet, wenn die Daten angezeigt werden. Anstelle von drei separaten Warteindikatoren können Sie einen Warteindikator erstellen, der die gesamte Benutzeroberfläche abbildet, die erst verschwindet, wenn alle drei empfangen wurden.

Was auch immer der Fall war, ich würde die Anrufe niemals seriell tätigen, WENN die Anrufe nicht voneinander abhängig wären. Nutzen Sie die eingebaute Asynchronität in Flex zu Ihrem Vorteil und machen Sie alle drei Anrufe parallel.

Ist das wonach Sie suchen ???

+0

Sorry, dass ich nicht sehr klar war. Danke für die Antwort, ist mein Problem nicht beim Anrufen der Remote-Dienste. Das Problem ist beim Anhäufen der Ergebnisse und Speichern sie in einem model.What ich versuche zu tun ist jeden Service Anruf zu machen ein separater Befehl (Aktionsskriptklasse, ähnlich einem Delegate-Objekt), so dass dieser Aufruf auf mehreren Seiten wiederverwendet werden kann, möchte ich den Code für die Aufrufe auf verschiedenen Seiten nicht wiederholen. Also im Grunde makeRequest2 (whenRequest2Finishes) wird in einem Befehl oder einer Klasse für sich und ähnlich anderen sein. Die einzige Sache ist, wie befülle ich das Modell, wenn ich das tue. – Rajat

+0

Ich bin in der Lage, dies jetzt zu tun, im Grunde habe ich einen einzigen Befehl erstellt und injizieren das Objekt anderer Befehle in ihm.Jeder Befehl ruft einen bestimmten Remote-Service und ich hole das Ergebnis in den Hauptbefehl und dann dieses Ergebnis verwenden in der Ansicht. So benutze ich den Service-Level-Code wieder. Dies ist ähnlich einem Delegate-Muster. Ist dieser Ansatz gut. Ich kapseln Dienste, weil der Service-Aufruf häufig ändern kann, wie es von einem separaten Team getan wird, und ich don ' t wollen am Ende alle WEP-Seiten mit dem Code für den Aufruf von Diensten koppeln. – Rajat

1

Sie könnten ein einzelnes Objekt haben, das die drei Ergebnisse der Aufrufe enthält und jeden Antwort-Handler veranlassen, ihre Antwort in das Objekt zu schreiben und zu verifizieren, dass es nicht der letzte Aufruf ist, der angekommen ist.

Beispiel:

Klasse ManyResult
var firstResult: *
var secondResult: *
var thirdResult: *

Funktion vollständig erhalten(): Boolean {return firstResult & & secondResult & & thirdResult ;
Parse-Ergebnis

wenn ManyResult.complete
put analysiert Ergebnis in ManyResult Objekt:}

In jedem Handler

Sie würden diese generische Logik
method_which_glues_all_three_results_together()

würde ich mit nicht empfehlen Diese Lösung, wenn dieses Problem häufig auftritt, wie es leicht unordentlich wird. Ich rate Ihnen, einen generischen Code zu erstellen, der das für Sie auf eine saubere, standardmäßige Art und Weise erledigt.