2009-12-02 12 views
1

J'ai quelques problèmes de tir et de suppression d'événements dans l'ordre chronologique approprié. Le code ci-dessous donne le résultat suivant:Événements de tir condition de la course dans AS3

  • Enregistrer l'affiche dans db, et l'événement d'expédition
  • service d'appel, événement dispatch supprimé = Service faux
  • appelant, événement dispatch supprimé = false service d'appel
  • , événement dispatch supprimé = true
  • Enregistrer l'affiche dans db, et l'événement d'expédition
  • Enregistrer l'affiche dans db, et l'événement d'expédition

Bien sûr, cela devrait être plus quelque chose comme:

  • Enregistrer l'affiche dans db, et l'événement d'expédition
  • service d'appel, un événement d'expédition supprimé = true
  • Enregistrer l'affiche dans db, et l'événement d'expédition
  • service d'appel, envoi de l'événement enlevé = true
  • enregistrer l'affiche dans la base de données, et l'événement d'envoi
  • service d'appel, événement dispatch removed = true

Quelqu'un peut-il m'aider? Je suis à court d'idées sur la façon d'aborder cela.

thx!

for(var i:int = 0;i< 3;i++){ 
     createPoster();   
    } 

    function createPoster(){ 
     Main.db.savePoster(); 
     Main.db.addEventListener(Config.evt_SAVEPOSTER_READY, callService); 
    } 

    function callService(){ 
     Main.db.removeEventListener(Config.evt_SAVEPOSTER_READY, callService); 
    } 

Répondre

0

Avez-vous vérifié ce qui se passe lorsque vous passez en revue un élément seulement? Il me semble que vous ne faites pas la queue correctement vos routines.

Vous voudrez probablement ajouter un écouteur d'événement à votre objet Main.db une seule fois et le supprimer lorsque vous aurez sauvegardé toutes vos «affiches».

+0

Hey Thx pour la réponse. Oui je l'ai fait, il n'y a pas de problème lors de la boucle une fois. J'ai mis un timer dans la boucle for et si je déclenche le createPoster toutes les 1000 millisecondes, il n'y a pas de problème. On dirait que la boucle for va rapide pour que l'événement puisse être retiré. –

+0

L'ajout d'un délai pour résoudre le problème est une stratégie faible. Je pourrais poster un exemple de code plus tard pour expliquer mon point ci-dessus. – Rey

+0

Le code de bhups ci-dessus fera l'affaire. Je suis dehors. – Rey

1

Le problème est que vous enregistrez même fonction callService pour un même événement Config.evt_SAVEPOSTER_READY unique objet EvenDispatcherdb. Ainsi, dès que savePoster distribue l'événement après l'enregistrement de l'affiche, db reçoit l'événement et trois eventHandlers (dans ce cas callService) sont appelés parce que callService est enregistré trois fois. Donc, une solution serait d'envoyer les événements de Poster.

for(var i:int = 0;i< 3;i++){ 
    createPoster(); 
} 
function createPoster(){ 
    poster = Main.db.savePoster(); 
    poster.addEventListener(Config.evt_SAVEPOSTER_READY, callService); 
} 
function callService(e:PosterEvent){ 
    e.target.removeEventListener(Config.evt_SAVEPOSTER_READY, callService); 
}

+0

hmmm bon point. Je vais l'implémenter et y revenir. Merci pour une réponse utile! –

0

L'appel db (Main.db.savePoster();) est-il synchrone? Renvoie-t-il uniquement une fois l'action terminée? Puisque vous appelez addEventListener après l'appel db, l'écouteur d'événement (pour la première itération au moins) ne sera pas appelé si l'appel db est synchrone.

La Main.db est-elle la même instance dans les trois itérations? Si c'est le cas, vous n'avez pas à enregistrer trois fois le même écouteur d'événement - une fois suffirait. Appelez addEventListener avant de démarrer la boucle for. Gardez un compteur pour suivre le nombre d'appels à callService et appelez removeEventListener une fois que le compteur a atteint le nombre de boucles (3, dans ce cas).