Der beste Weg, 1:1 asynchrone Rückrufe/Ereignisse in ActionScript 3/Flex/AIR zu implementieren?

StackOverflow https://stackoverflow.com/questions/53025

Frage

Ich habe das genutzt Befehlsmuster In meinen Flex-Projekten sind asynchrone Rückrufrouten erforderlich zwischen:

  • Wer auch immer ein bestimmtes Befehlsobjekt und das Befehlsobjekt instanziiert hat,
  • das Befehlsobjekt und das „Datenzugriff“-Objekt (d. h.(jemand, der die Remote-Prozeduraufrufe über das Netzwerk an die Server abwickelt), die das Befehlsobjekt aufruft.

Jede dieser beiden Rückrufrouten muss eine Eins-zu-Eins-Beziehung darstellen können.Dies liegt an der Tatsache, dass ich möglicherweise mehrere Instanzen einer bestimmten Befehlsklasse habe, die genau denselben Job zur gleichen Zeit ausführen, jedoch mit leicht unterschiedlichen Parametern, und ich möchte nicht, dass ihre Rückrufe verwechselt werden.Die Verwendung von Ereignissen, der Standardmethode zum Umgang mit Asynchronität in AS3, ist daher so gut wie ausgeschlossen, da sie von Natur aus auf Eins-zu-vielen-Beziehungen basieren.

Derzeit habe ich dies mit gemacht Callback-Funktionsreferenzen mit bestimmten Arten von Signaturen, aber ich habe mich gefragt Wenn jemand einen besseren (oder alternativen) Weg wüsste?

Hier ist ein Beispiel zur Veranschaulichung meiner aktuellen Methode:

  • Ich könnte ein Ansichtsobjekt haben, das ein erzeugt DeleteObjectCommand Instanz aufgrund einer Benutzeraktion, die Verweise auf zwei ihrer eigenen privaten Mitgliedsfunktionen übergibt (eine für Erfolg, eine für Fehler):sagen wir "deleteObjectSuccessHandler()" Und "deleteObjectFailureHandler()" in diesem Beispiel) als Callback-Funktionsreferenzen auf den Konstruktor der Befehlsklasse.
  • Dann würde das Befehlsobjekt dieses Muster mit seiner Verbindung zum „Datenzugriff“-Objekt wiederholen.
  • Wenn der RPC über das Netzwerk erfolgreich abgeschlossen wurde (oder fehlgeschlagen ist), werden die entsprechenden Rückruffunktionen aufgerufen, zuerst vom Objekt „Datenzugriff“ und dann vom Befehlsobjekt, sodass schließlich das Ansichtsobjekt, das den Vorgang im ersten instanziiert hat, aufgerufen wird Der Ort wird benachrichtigt, indem er seine hat deleteObjectSuccessHandler() oder deleteObjectFailureHandler() angerufen.
War es hilfreich?

Lösung

Ich probiere noch eine Idee aus:

Lassen Sie Ihr Datenzugriffsobjekt seine eigenen AsyncTokens (oder einige andere Objekte, die einen ausstehenden Aufruf kapseln) zurückgeben, anstelle des AsyncTokens, das vom RPC-Aufruf stammt.Im DAO würde es also ungefähr so ​​aussehen (das ist ein sehr lückenhafter Code):

public function deleteThing( id : String ) : DeferredResponse {
    var deferredResponse : DeferredResponse = new DeferredResponse();

    var asyncToken : AsyncToken = theRemoteObject.deleteThing(id);

    var result : Function = function( o : Object ) : void {
        deferredResponse.notifyResultListeners(o);
    }

    var fault : Function = function( o : Object ) : void {
        deferredResponse.notifyFaultListeners(o);
    }

    asyncToken.addResponder(new ClosureResponder(result, fault));

    return localAsyncToken;
}

Der DeferredResponse Und ClosureResponder Klassen gibt es natürlich nicht.Anstatt Ihr eigenes zu erfinden, könnten Sie es verwenden AsyncToken anstatt DeferredResponse, aber die öffentliche Version von AsyncToken scheint keine Möglichkeit zu haben, die Responder auszulösen, daher müssten Sie es wahrscheinlich trotzdem in eine Unterklasse umwandeln. ClosureResponder ist nur eine Implementierung von IResponder das eine Funktion bei Erfolg oder Misserfolg aufrufen kann.

Wie auch immer, die Art und Weise, wie der obige Code seine Aufgabe erfüllt, besteht darin, dass er einen RPC-Dienst aufruft, ein Objekt erstellt, das den ausstehenden Aufruf kapselt, dieses Objekt zurückgibt und dann, wenn der RPC zurückkehrt, einen der Schließungen durchführt result oder fault aufgerufen wird, und da sie immer noch Verweise auf den Bereich haben, wie er war, als der RPC-Aufruf durchgeführt wurde, können sie die Methoden für den ausstehenden Aufruf/die verzögerte Antwort auslösen.

Im Befehl würde es etwa so aussehen:

public function execute( ) : void {
    var deferredResponse : DeferredResponse = dao.deleteThing("3");

    deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
    deferredResponse.addEventListener(FaultEvent.FAULT,   onFault);
}

oder Sie könnten das Muster wiederholen, indem Sie das haben execute Die Methode gibt eine eigene verzögerte Antwort zurück, die ausgelöst wird, wenn die verzögerte Antwort, die der Befehl vom DAO erhält, ausgelöst wird.

Aber.Ich finde das nicht besonders hübsch.Sie könnten wahrscheinlich etwas Schöneres, weniger Komplexes und weniger Verwickeltes tun, indem Sie eines der vielen Anwendungs-Frameworks verwenden, die es gibt, um mehr oder weniger genau diese Art von Problem zu lösen.Mein Vorschlag wäre Kumpel.

Andere Tipps

Viele der Flex RPC-Klassen, wie z RemoteObject, HTTPService, usw.zurückkehren AsyncTokenEs ist, wenn du sie anrufst.Es hört sich so an, als wäre es das, wonach Sie suchen.Im Grunde die AsyncToken kapselt den ausstehenden Anruf und ermöglicht die Registrierung von Rückrufen (in Form von IResponder Instanzen) einem bestimmten Anruf zuordnen.

Im Fall von HTTPService, wenn du anrufst send() ein AsyncToken wird zurückgegeben, und Sie können dieses Objekt verwenden, um den spezifischen Aufruf zu verfolgen, im Gegensatz zu ResultEvent.RESULT, der ausgelöst wird, unabhängig davon, um welchen Anruf es sich handelt (und Anrufe können leicht in einer anderen Reihenfolge eingehen, als sie gesendet wurden).

Die AbstractCollection ist die beste Möglichkeit, mit persistenten Objekten in Flex/AIR umzugehen.Das GenericDAO liefert die Antwort.

DAO ist das Objekt, das es schafft, den CRUD -Betrieb und andere gemeinsame Operationen über ein ValueObject (bekannt als Pojo in Java) auszuführen.GenericDAO ist eine wiederverwendbare DAO-Klasse, die generisch verwendet werden kann.Ziel:

In Java IBM GenericDao, um einen neuen DAO hinzuzufügen, sind die zu erledigen, nur ein ValueObject (Pojo) hinzugefügt.Fügen Sie eine hbm.xml-Zuordnungsdatei für das Wertobjekt hinzu.Fügen Sie die 10-zeilige Spring-Konfigurationsdatei für das DAO hinzu.

Ebenso im AS3-Projekt Swiz DAO.Wir wollen eine ähnliche Erfolgsbilanz erreichen.

Clientseitiges GenericDAO-Modell:Da wir an einer clientseitigen Sprache arbeiteten, sollten wir auch eine persistente Objektsammlung (für jedes valueObject) verwalten.Verwendung:Quelle:http://github.com/nsdevaraj/SwizDAO

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top