Question

Travaillant actuellement sur un projet Flex Air basé sur le cadre PureMVC. Il y avait une nouvelle exigence au projet, une opération doit être effectuée de manière répétitive à intervalle régulier qui a une logique commerciale. Selon Puremvc, cela devrait être placé dans la commande, mais la commande obtiendrait alors les ordures collectées au moment où il est exécuté.

Compte tenu du scénario, il y a peu de doutes / confusions / clarifications ...

  1. Créer une commande avec une logique métier serait une solution ... mais qui le déclencherait à un intervalle spécifique? (cela ne devrait-il pas être fait par une commande selon Puremvc)
  2. Placer le déclencheur de commande dans un médiateur ou placer la logique dans un médiateur (cela rendrait Puremvc un peu impur :))

Comment trouver une solution pour ce type de scénario?

Était-ce utile?

La solution

Vous devez séparer le processus asynchrone que vous souhaitez exécuter et le déclenchement répétitif dudit processus. Mon conseil est de créer un proxy pour le processus asynchrone et un proxy distinct qui est un emballage pour une minuterie qui envoie simplement une notification lors du temps mort. La notification est couplée à une commande, qui à son tour appelle les méthodes du proxy asynchrones. De cette façon, vous pouvez ajouter de la logique à la commande par exemple quoi faire si le processus est toujours occupé.

Les avantages de la création de deux indicateurs: vous adhérez à SRP. Vous pouvez facilement échanger / modifier / supprimer le proxy de synchronisation sans toucher le proxy asynchrone. Tout est bien séparé.

Autres conseils

dépend de ce que le Command devrait faire - s'il met à jour le Model mettre un Timer Dans l'un de vos Proxy classe et envoyez un Notification toutes les xx secondes qui sont mappées à un Command Cela fait tout ce que vous voulez qu'il fasse.

S'il devait simplement mettre à jour le View vous pouvez ajouter le Timer au correspondant Mediator Mais alors tu n'aurais pas besoin d'un Command du tout.

**

Ne créez pas plus de singletons que vous avez besoin. ApplicationFacade est déjà un - essayez de le garder ainsi.

**

Si vous devez faire des appels asynchronisés vers le backend, assurez-vous simplement d'ajouter le EventListener sans pour autant weakReference réglé sur true - alors tout devrait être OK ...

Essaye ça:

  • Créez une classe singleton - classe singleton en flex
  • Ayez une fonction dans cette classe (par exemple, appelée Démarrer) qui, lorsqu'elle est appelée, démarre un minuteur, dont la fonction de rappel envoie une notification, qui déclenche une commande qui fait votre logique métier.
  • Lorsque vous êtes prêt à démarrer vos actions régulières, appelez simplement la méthode d'instance Get sur votre singleton, pour créer le singleton, puis appelez la fonction start (). * Éventuellement, avoir une fonction d'arrêt qui annule la minuterie et arrête les notifications régulières envoyées.

    package
    {
     import flash.events.TimerEvent;
     import flash.utils.Timer;
    
    
     public final class RepititiveSingleton
     {
        private var timer:Timer;
    
        private static var instance:RepititiveSingleton= new RepititiveSingleton();
    
        public function RepititiveSingleton() {
            if( RepititiveSingleton.instance ) {
                throw new Error( 
                    "ReptitiveSingleton can only be accessed through Singleton.getInstance()" ); 
            }
        }
    
        public static function getInstance():RepititiveSingleton{                        
            return RepititiveSingleton.instance;
        }
    
        public function start(interval:Number = 1000):void {
            timer = new Timer(interval);
            timer.addEventListener(TimerEvent.TIMER, onTimer);
        }
    
        private function onTimer(e:TimerEvent):void {
                     ApplicationFacade.getInstance().sendNotification(Constants.REPTITIVE_ACTION_NOTIFICATION));
        }
    
     }
    }
    

Ce code suppose que vous avez votre façade en béton nommée ApplicationFacade et avez enregistré une notification à l'aide d'une constante de chaîne qui est référencée à partir d'une classe appelée constantes.

Ensuite, dans un endroit approprié (peut-être dans votre commande de démarrage), vous pouvez ajouter:

RepetitiveSingleton.getInstance().start();

J'espère que cela vous aide.

OMI, la minuterie appartient à un médiateur. Laissez-le - eh bien, médiat la messagerie de processus asynch. Ce sera une petite machine d'état pour s'assurer que tout fonctionne bien. Les commandes font toujours le gros du travail, il se trouve juste comme un opérateur du 911.

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