Die beste manier om te implementeer 1:1 asynchrone verificaties/gebeure in Action 3 / Flex / LUG?
-
09-06-2019 - |
Vra
Ek het al met behulp van die opdrag patroon in my Flex projekte, met asinchroniese terugbel roetes vereis word tussen:
- wie aangehaal'n gegewe opdrag voorwerp en die opdrag voorwerp,
- die opdrag voorwerp en die "data toegang" voorwerp (bv.iemand wat hanteer die afgeleë proses oproepe oor die netwerk na die bedieners) dat die opdrag voorwerp oproepe.
Elk van hierdie twee terugbel roetes het om in staat wees om'n een-tot-een verhouding.Dit is te danke aan die feit dat ek dalk'n paar gevalle van'n gegewe opdrag klas loop presies dieselfde werk op dieselfde tyd, maar met effens verskillende parameters, en ek wil nie hul verificaties om deurmekaar.Met behulp van die gebeure, die standaard manier van hantering asynchronicity in AS3, is dus redelik baie uit, want hulle is inherent gebaseer op een-tot-baie-verhoudings.
Tans ek het dit gedoen met behulp van terugbel funksie verwysings met spesifieke vorme van handtekeninge, maar ek wonder as iemand weet van'n beter (of'n alternatiewe) manier?
Hier is'n voorbeeld om te illustreer my huidige metode:
- Ek kan het'n uitsig voorwerp wat toegevoeg'n
DeleteObjectCommand
byvoorbeeld as gevolg van'n paar gebruiker aksie, verby verwysings na twee van sy eie private lid funksies (een vir sukses, een vir mislukking:kom ons sê"deleteObjectSuccessHandler()"
en"deleteObjectFailureHandler()"
in hierdie voorbeeld) as terugbel funksie verwysings na die opdrag klas se konstruktor. - Dan is die opdrag voorwerp sou herhaal hierdie patroon met sy verbinding met die "data toegang" voorwerp.
- Wanneer die RPC oor die netwerk suksesvol voltooi is (of nie), die toepaslike terugbel funksies genoem word, eers deur die "data toegang" voorwerp en dan die opdrag voorwerp, sodat uiteindelik die oog voorwerp wat aangehaal die operasie in die eerste plek kry kennis gestel word deur die feit dat sy
deleteObjectSuccessHandler()
ofdeleteObjectFailureHandler()
genoem.
Oplossing
Ek sal probeer om een meer idee:
Jou Data Toegang Voorwerp terugkeer hul eie AsyncTokens (of'n paar ander voorwerpe wat omsluit'n hangende noem), in plaas van die AsyncToken wat kom uit die RPC noem.So, in die DAO dit sou lyk iets soos hierdie (dit is baie oppervlakkig 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;
}
Die DeferredResponse
en ClosureResponder
klasse bestaan nie, van die kursus.In plaas van die uitvind van jou eie wat jy kan gebruik AsyncToken
in plaas van DeferredResponse
, nie , maar die openbare weergawe van AsyncToken
dit lyk nie asof enige manier van verwek die responders, so jy sal waarskynlik het om te subklas dit in elk geval. ClosureResponder
is net'n uitvoering van IResponder
wat kan noem'n funksie op die sukses of mislukking.
In elk geval, die manier waarop die kode bogenoemde is dit besigheid is wat dit vra'n RPC diens, skep'n voorwerp vat die hangende noem, gee dat die voorwerp, en dan wanneer die RPC opbrengste, een van die sluitings result
of fault
kry genoem, en omdat hulle nog verwysings na die omvang as wat dit was toe die RPC oproep gemaak is, is hulle kan sneller die metodes op die hangende oproep/uitgestelde reaksie.
In die bevel dit sou lyk iets soos hierdie:
public function execute( ) : void {
var deferredResponse : DeferredResponse = dao.deleteThing("3");
deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
deferredResponse.addEventListener(FaultEvent.FAULT, onFault);
}
of, jy kan herhaal die patroon, met die execute
metode terugkeer'n uitgestelde reaksie van sy eie wat sou veroorsaak wanneer die uitgestelde reaksie wat die opdrag kry van die DAO is geaktiveer.
Maar.Ek dink nie dit is veral mooi.Jy kan waarskynlik nie iets mooier, minder kompleks en minder verstrengel deur gebruik te maak van een van die vele aansoek raamwerke wat bestaan op te los meer of minder presies hierdie soort van probleem.My voorstel sou wees Maat.
Ander wenke
Baie van die Flex RPC klasse, soos RemoteObject
, HTTPService
, ens terugkeer AsyncToken
s wanneer jy hulle bel. Dit klink soos hierdie is wat jy na. Basies die AsyncToken
omvat die hangende oproep, wat dit moontlik maak om verifikasie registreer (in die vorm van IResponder
gevalle) na 'n spesifieke oproep.
In die geval van HTTPService
, wanneer jy bel send()
n AsyncToken
teruggestuur, en jy kan hierdie voorwerp gebruik om die spesifieke oproep dop, in teenstelling met die ResultEvent.RESULT
, wat kry geaktiveer ongeag watter noem dit (en oproepe kan maklik kom in in 'n ander orde as hulle gestuur).
Die AbstractCollection is die beste manier om te gaan met Aanhoudende Voorwerpe in Flex / LUG.Die GenericDAO bied die antwoord.
DAO is die Voorwerp wat die bestuur uit te voer CRUD Operasie en ander Algemene Bedrywighede word gedoen oor'n ValueObject ( bekend as Pojo in Java ).GenericDAO is'n herbruikbare DAO klas wat gebruik kan word generies.Doel:
In JAVA IBM GenericDAO, by te voeg'n nuwe DAO, die stappe wat gedoen moet word, is eenvoudig, Voeg'n valueobject (pojo).Voeg'n hbm.xml kartering lêer vir die valueobject.Voeg die 10-lyn Lente opset lêer vir die DAO.
Net so, in AS3 Projek Swiz DAO.Ons wil om te bereik'n soortgelyke voete van prestasie.
Kliënt Kant GenericDAO model:As ons werk op'n Kliënt Kant taal, ook moet ons die bestuur van'n aanhoudende voorwerp Versameling (vir elke valueObject) .Gebruik:Bron:http://github.com/nsdevaraj/SwizDAO