Domanda

Ho utilizzato il modello di comando nei miei progetti Flex, con percorsi di callback asincroni richiesti tra:

  • chiunque abbia istanziato un dato oggetto comando e l'oggetto comando,
  • l'oggetto comando e l'oggetto "accesso ai dati" (ovveroqualcuno che gestisce le chiamate di procedura remota sulla rete ai server) che l'oggetto comando chiama.

Ciascuno di questi due percorsi di richiamata deve poter essere una relazione uno-a-uno.Ciò è dovuto al fatto che potrei avere diverse istanze di una determinata classe di comandi che eseguono esattamente lo stesso lavoro contemporaneamente ma con parametri leggermente diversi e non voglio che i loro callback vengano confusi.L'utilizzo degli eventi, il modo predefinito di gestire l'asincronicità in AS3, è quindi praticamente inutilizzato poiché sono intrinsecamente basati su relazioni uno-a-molti.

Attualmente l'ho fatto utilizzando riferimenti alla funzione di callback con tipi specifici di firme, ma mi chiedevo se qualcuno conoscesse un modo migliore (o alternativo)?

Ecco un esempio per illustrare il mio metodo attuale:

  • Potrei avere un oggetto vista che genera un file DeleteObjectCommand istanza a causa di alcune azioni dell'utente, passando riferimenti a due delle sue funzioni membro private (una per il successo, una per il fallimento:diciamo "deleteObjectSuccessHandler()" E "deleteObjectFailureHandler()" in questo esempio) poiché la funzione di callback fa riferimento al costruttore della classe di comando.
  • Quindi l'oggetto comando ripeterebbe questo schema con la sua connessione all'oggetto "accesso ai dati".
  • Quando l'RPC sulla rete è stato completato con successo (o ha fallito), vengono chiamate le funzioni di callback appropriate, prima dall'oggetto "accesso ai dati" e poi dall'oggetto comando, in modo che infine l'oggetto vista che ha istanziato l'operazione nel primo il luogo viene avvisato avendolo deleteObjectSuccessHandler() O deleteObjectFailureHandler() chiamato.
È stato utile?

Soluzione

Proverò un'altra idea:

Chiedi al tuo oggetto di accesso ai dati di restituire i propri AsyncToken (o altri oggetti che incapsulano una chiamata in sospeso), invece dell'AsyncToken proveniente dalla chiamata RPC.Quindi, nel DAO sarebbe simile a questo (questo è un codice molto approssimativo):

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

IL DeferredResponse E ClosureResponder le classi non esistono, ovviamente.Invece di inventarne uno tuo potresti usare AsyncToken invece di DeferredResponse, ma la versione pubblica di AsyncToken non sembra avere alcun modo di attivare i risponditori, quindi probabilmente dovresti comunque sottoclassarlo. ClosureResponder è solo un'implementazione di IResponder che può chiamare una funzione in caso di successo o fallimento.

Ad ogni modo, il modo in cui il codice sopra fa il suo lavoro è che chiama un servizio RPC, crea un oggetto che incapsula la chiamata in sospeso, restituisce quell'oggetto e poi quando ritorna l'RPC, una delle chiusure result O fault viene chiamato e poiché hanno ancora riferimenti all'ambito com'era quando è stata effettuata la chiamata RPC, possono attivare i metodi sulla chiamata in sospeso/risposta differita.

Nel comando sarebbe simile a questo:

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

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

oppure potresti ripetere lo schema, avendo il execute Il metodo restituisce una propria risposta differita che verrebbe attivata quando viene attivata la risposta differita che il comando riceve dal DAO.

Ma.Non penso che questo sia particolarmente carino.Probabilmente potresti fare qualcosa di più carino, meno complesso e meno intricato utilizzando uno dei tanti framework applicativi esistenti per risolvere più o meno esattamente questo tipo di problema.Il mio suggerimento sarebbe Compagno.

Altri suggerimenti

Molte delle classi Flex RPC, come RemoteObject, HTTPService, eccetera.ritorno AsyncTokenè quando li chiami.Sembra che questo sia quello che stai cercando.Fondamentalmente il AsyncToken incapsula la chiamata in sospeso, rendendo possibile la registrazione dei callback (sotto forma di IResponder istanze) a una chiamata specifica.

In caso di HTTPService, quando chiami send() UN AsyncToken viene restituito ed è possibile utilizzare questo oggetto per tenere traccia della chiamata specifica, a differenza di ResultEvent.RESULT, che viene attivato indipendentemente dalla chiamata (e le chiamate possono facilmente arrivare in un ordine diverso da quello in cui sono state inviate).

AbstractCollection è il modo migliore per gestire gli oggetti persistenti in Flex/AIR.Il GenericDAO fornisce la risposta.

DAO è l'oggetto che riesce a eseguire il funzionamento del CRUD e altre operazioni comuni da eseguire su un valori object (noto come pojo in java).GenericDAO è una classe DAO riutilizzabile che può essere utilizzata genericamente.Obiettivo:

In Java IBM Genericdao, per aggiungere un nuovo DAO, i passaggi da fare è semplicemente, aggiungi un valobject (pojo).Aggiungere un file di mappatura hbm.xml per valueobject.Aggiungi il file di configurazione Spring di 10 righe per DAO.

Allo stesso modo, nel progetto AS3 Swiz DAO.Vogliamo raggiungere un traguardo simile.

Modello GenericDAO lato client:Dato che stavamo lavorando su un linguaggio lato client, dovremmo gestire anche una raccolta di oggetti persistente (per ogni valueObject).Utilizzo:Fonte:http://github.com/nsdevaraj/SwizDAO

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top