La meilleure façon de mettre 1:1 rappels asynchrones/événements en ActionScript 3 / Flex / AIR?

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

Question

J'ai été l'utilisation de la modèle de commande dans mes projets Flex, avec rappel asynchrone routes nécessaire entre:

  • celui qui instancié un objet de commande et la commande de l'objet,
  • l'objet de commande et de l "accès aux données" de l'objet (c'est à direquelqu'un qui gère les appels de procédure distante sur le réseau pour les serveurs) que l'objet de commande des appels.

Chacun de ces deux rappel des routes doit être en mesure d'être un one-to-one relation.Cela est dû au fait que je pourrais avoir plusieurs instances d'une même classe de commande de l'exécution de l'exacte même travail dans le même temps, mais avec un peu de paramètres différents, et je ne veux pas que des rappels de se mêler.À l'aide d'événements, par défaut, de la manipulation de l'asynchronicité en AS3, est donc assez bien depuis qu'ils sont intrinsèquement fondée sur un-à-plusieurs relations.

Actuellement, j'ai fait cela à l'aide de fonction de rappel des références avec certains types de signatures, mais je me demandais si quelqu'un connaissait de mieux (ou une alternative) de la sorte?

Voici un exemple pour illustrer ma méthode actuelle:

  • Je pourrais avoir une vue de l'objet qui génère un DeleteObjectCommand exemple suite à une action de l'utilisateur, en passant références à deux de ses propres privé des fonctions membres (un pour réussir, celle de l'échec:disons "deleteObjectSuccessHandler()" et "deleteObjectFailureHandler()" dans cet exemple) comme fonction de rappel des références pour la commande du constructeur de la classe.
  • Ensuite, la commande de l'objet serait répéter ce motif de sa connexion à l'accès aux données "objet".
  • Lors de la RPC sur le réseau a été établie avec succès (ou d'échec), l'fonctions de rappel sont appelés, d'abord par le "accès aux données" objet et de l'objet de commande, de sorte que, finalement, la vue objet instancié à l'opération, en premier lieu, est notifié par le fait d'avoir son deleteObjectSuccessHandler() ou deleteObjectFailureHandler() appelé.
Était-ce utile?

La solution

Je vais essayer encore une idée:

Avoir vos Données d'Accès de l'Objet le retour de leur propre AsyncTokens (ou d'autres objets qui encapsulent un appel en attente), au lieu de la AsyncToken qui vient de l'appel RPC.Ainsi, dans le DAO, il ressemblerait à quelque chose comme ceci (c'est très sommaire de 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;
}

L' DeferredResponse et ClosureResponder les classes n'existent pas, bien sûr.Au lieu d'inventer votre propre, vous pourriez utiliser AsyncToken au lieu de DeferredResponse, mais la version publique de AsyncToken ne semble pas avoir n'importe quel moyen de déclencher les intervenants, de sorte que vous aurait probablement à la sous-classe de toute façon. ClosureResponder est juste de la mise en œuvre de IResponder que l'on peut appeler une fonction de la réussite ou de l'échec.

De toute façon, la manière dont le code ci-dessus est-il de l'entreprise est qu'il demande un service RPC, crée un objet de l'encapsulation de l'appel en attente, renvoie l'objet, puis lors de la RPC retourne, l'un des fermetures de result ou fault est appelée, et depuis ils ont encore des références à la portée que lors de l'appel RPC a été faite, ils peuvent déclencher les méthodes sur l'appel en attente/différé de réponse.

Dans la commande, il ressemblerait à quelque chose comme ceci:

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

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

ou, vous pouvez répéter le motif, ayant la execute méthode renvoie une réponse différée de son propre qui serait déclenchée lorsque le report de la réponse que la commande soit à partir de la DAO est déclenchée.

Mais.Je ne pense pas que c'est particulièrement jolie.Vous pourriez probablement faire quelque chose de plus sympa, moins complexe et moins intriqués en utilisant l'un des nombreux frameworks d'applications qui existent pour résoudre plus ou moins exactement ce genre de problème.Ma suggestion serait Mate.

Autres conseils

De nombreuses de la RPC Flex classes, comme RemoteObject, HTTPService, etc.de retour AsyncTokens lorsque vous les appelez.Il semble que cela est ce que vous êtes après.Fondamentalement, l' AsyncToken encapsule l'appel en attente, ce qui rend possible d'enregistrer des rappels (sous la forme de IResponder instances) à un appel spécifique.

Dans le cas de HTTPService, lorsque vous appelez send() un AsyncToken est retourné, et vous pouvez utiliser cet objet pour suivre l'appel spécifique, contrairement à l' ResultEvent.RESULT, qui est déclenchée indépendamment de qui c'est (et les appels peuvent facilement entrer dans un ordre différent de celui qu'ils ont été envoyés).

Le AbstractCollection est la meilleure façon de faire face à la persistance des Objets en Flex / AIR.Le GenericDAO fournit la réponse.

DAO est l'Objet qui gère pour effectuer l'Opération CRUD et d'autres Communes Opérations à faire sur une ValueObject ( connu sous le nom Pojo Java ).GenericDAO est une réutilisables classe DAO qui peut être utilisé de façon générique.Objectif:

En JAVA IBM GenericDAO, pour ajouter un nouveau DAO, les étapes à faire est tout simplement, Ajouter un valueobject (pojo).Ajouter un hbm.xml fichier de mappage pour le valueobject.Ajouter la 10 ligne de Printemps de fichier de configuration pour le DAO.

De même, en AS3 Projet Swiz DAO.Nous voulons atteindre un semblable pieds de réalisation.

Côté Client GenericDAO modèle:Comme nous avons travaillé sur un langage Côté Client, nous devrions aussi être la gestion d'un objet persistant de la Collection (pour chaque valueObject) .Utilisation:Source:http://github.com/nsdevaraj/SwizDAO

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top