A melhor maneira de implementar a 1:1 retornos de chamada assíncronos/eventos no ActionScript 3 / Flex / AIR?

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

Pergunta

Eu venho utilizando o padrão de comando na minha Flex projetos, com retorno de chamada assíncrono rotas necessária entre:

  • quem instanciado um comando determinado objeto e o objeto de comando,
  • o objeto de comando e o "acesso a dados" do objeto (por exemplo,alguém que lida com as chamadas de procedimento remoto através da rede para os servidores) que o objeto de comando chamadas.

Cada uma destas duas rotas de retorno de chamada tem de ser capaz de ser um um-para-um relacionamento.Isto é devido ao fato de que eu poderia ter várias instâncias de uma determinada classe de comando executando exatamente a mesma tarefa, ao mesmo tempo, mas com parâmetros ligeiramente diferentes, e eu não quero a sua retornos de chamada de obter misto.A utilização de eventos, a forma padrão de tratamento de asynchronicity em AS3, é, portanto, muito bonito, pois eles são inerentemente baseado no um-para-muitos relacionamentos.

Atualmente tenho feito esta usando função de retorno de chamada referências com tipos específicos de assinaturas, mas eu estava me perguntando se alguém sabia de uma melhor (ou alternativa) forma?

Aqui está um exemplo para ilustrar o meu método atual:

  • Eu poderia ter um modo de exibição de objeto que gera uma DeleteObjectCommand exemplo devido a alguma ação do usuário, passando referências a dois de funções de membro (uma para o sucesso, uma para o fracasso:vamos dizer que "deleteObjectSuccessHandler()" e "deleteObjectFailureHandler()" neste exemplo) como função de retorno de chamada referências ao comando construtor da classe.
  • Em seguida, o objeto de comando seria repetir esse modelo com a ligação para o "acesso a dados" do objeto.
  • Quando o RPC sobre a rede foi concluída com sucesso (ou falha), apropriado funções de retorno de chamada são chamados, em primeiro lugar, o "acesso a dados" objeto e, em seguida, o objeto de comando, de modo que, finalmente, o objeto de exibição que instanciado a operação, em primeiro lugar, fica notificado por ter a sua deleteObjectSuccessHandler() ou deleteObjectFailureHandler() chamado.
Foi útil?

Solução

Eu vou tentar mais uma idéia:

Ter Acesso a seus Dados Objeto de retorno de seu próprio AsyncTokens (ou alguns outros objetos que encapsulam uma chamada pendente), em vez de o AsyncToken que vem de chamada RPC.Assim, no DAO seria algo parecido com isso (isso é muito desenhadas à mão o código):

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

O DeferredResponse e ClosureResponder classes não existem, é claro.Em vez de inventar seu próprio país, você pode usar AsyncToken em vez de DeferredResponse, mas a versão pública do AsyncToken não parece ter qualquer forma de desencadear a resposta, então você provavelmente teria de subclasse-lo de qualquer maneira. ClosureResponder é apenas uma implementação de IResponder que pode chamar uma função em caso de sucesso ou falha.

De qualquer maneira, a forma como o código acima faz o seu negócio é o que ele chama de um serviço RPC, cria um objeto que encapsula a chamada pendente, retorna o objeto e, em seguida, quando o RPC retorna, um dos encerramentos result ou fault é chamado, e uma vez que eles ainda têm referências para o âmbito do que quando a chamada RPC foi feito, eles podem disparar os métodos na chamada pendente/diferido resposta.

No comando seria algo parecido com isso:

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

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

ou, você poderia repetir o padrão, tendo o execute método retornar um diferidos resposta do seu próprio, que teria acionado quando o diferidos resposta que o comando obtém a partir do DAO é acionado.

Mas.Eu acho que isto não é particularmente bonita.Você provavelmente poderia fazer algo mais agradável, menos complexo e menos preso usando um dos muitos frameworks de aplicativos que existem para resolver mais ou menos exatamente esse tipo de problema.A minha sugestão seria Mate.

Outras dicas

Muitos dos Flex RPC classes, como RemoteObject, HTTPService, etc.retorno AsyncTokens quando você chamá-los.Parece que é isso que você está depois.Basicamente, o AsyncToken encapsula a chamada pendente, tornando possível registrar chamadas de retorno (sob a forma de IResponder instâncias) para uma chamada específica.

No caso de HTTPService, quando você chamar send() um AsyncToken é devolvido, e você pode usar esse objeto para rastrear a chamada específica, ao contrário do ResultEvent.RESULT, que é acionado independentemente de qual é (e chamadas pode facilmente entrar em uma ordem diferente do que eles foram enviados).

O AbstractCollection é a melhor maneira de lidar com a persistência de Objetos em Flex / AIR.O GenericDAO fornece a resposta.

DAO é o Objeto, o qual consegue executar Operação de CRUD e outras Comum Operações de ser feita através de um ValueObject ( conhecido como Pojo em Java ).GenericDAO é reutilizável classe DAO que pode ser usado genericamente.Objetivo:

Em JAVA IBM GenericDAO, para adicionar um novo DAO, os passos a ser feito é simplesmente, Adicionar um valueobject (pojo).Adicionar um hbm.xml arquivo de mapeamento para o valueobject.Adicionar a 10-linha Mola arquivo de configuração para o DAO.

Da mesma forma, em AS3 Projeto Swiz DAO.Queremos atingir um semelhante pés de realização.

Do Lado do cliente GenericDAO modelo:Como estávamos trabalhando em um Cliente de Lado, também devemos ser a gestão de um objeto persistente Coleção (para cada valueObject) .Uso:Fonte:http://github.com/nsdevaraj/SwizDAO

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top