IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

remoteobject : sortir du mode asynchrone ? [CS5]


Sujet :

ActionScript 3

  1. #1
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut remoteobject : sortir du mode asynchrone ?
    Bonjour,

    j'étends actuellement un validateur afin de bloquer l'envoi du formulaire si l'utilisateur entre un pseudo déjà en base (unicité du pseudo).

    Voici une partie du code incriminé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    ...
    override protected function doValidation(value:Object):Array 
    		{
     
    			_ro = new RemoteObject();
    			_ro.destination = "zend";
    			_ro.source = "ServiceClasse";
    			_ro.addEventListener(ResultEvent.RESULT, result);
    			_ro.addEventListener(FaultEvent.FAULT, fault);
    			_ro.isUniquePseudo(value);	
     
    			var universCap:String = value.univers.charAt(0).toUpperCase() + value.univers.substr(1, value.univers.length - 1);
     
    			if(_retour == false)
    				_results.push(new ValidationResult(true, null, "PasUnique",	"Le pseudo entré existe déjà pour l'univers "+ universCap));
     
    			return _results;
     
    		}
     
    		private function result(event:ResultEvent):void
    		{
    			_retour = event.result as Boolean;
     
    		}
     
    		private function fault(event:FaultEvent):void
    		{
    			_results.push(new ValidationResult(true, null, "ErreurServeur", "Une erreur serveur est survenue lors de la validation du compte"));
    		}
    ...
    Le problème est le suivant : du au mode asynchrone (?) mon attribut _retour est mis à jour après mon test if(_retour == false) ce qui fait que je passe toujours dans ce if...

    Comment faire pour que que ma fonction result soit executée avant mon test du if ? En gros que mon événement soit écouté avant mon if ?

    Merci de votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Par défaut
    Hello !
    Flex fonctionne en asynchrone pur et il n'est pas possible de faire autrement.
    Il faut que tu mettes tes traitements dans ta fonction de retour result.
    Ça marchera très bien.

    Charles.

  3. #3
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour et merci de ta réponse. En fait j'avais déjà testé mais du coup le

    s'effectuait également avant le retour de ma fonction result et le problème restait le même. Du coup je fais maintenant les traitements dans la méthode handleResults (surchargée) qui est appelée après la méthode doValidation mais maintenant ca marche mais du deuxieme coup

    En gros, je clique sur mon bouton de validation de formulaire -> ca ne marche pas, je reclique -> ca marche, je reclique -> ca marche etc...

    Voici mon code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    package myvalidators
    {
     
    	import mx.events.ValidationResultEvent;
    	import mx.rpc.events.FaultEvent;
    	import mx.rpc.events.ResultEvent;
    	import mx.rpc.remoting.RemoteObject;
    	import mx.validators.ValidationResult;
    	import mx.validators.Validator;
     
    	public class UniquePseudoValidator extends Validator
    	{		
    		private var _results:Array = new Array();
    		private var _ro:RemoteObject = new RemoteObject();
    		private var _retour:Boolean = new Boolean();
    		private var _value:Object = new Object();
    		private var _eventResult:Object = new Object();
    		public var universObj:Object = new Object();
     
     
    		public function UniquePseudoValidator()
    		{
    			super();
    		}
     
    		override protected function getValueFromSource():Object
    		{
    			_value.pseudo = super.getValueFromSource();
    			_value.univers = universObj.univers;
    			_value.universCap = _value.univers.charAt(0).toUpperCase() + _value.univers.substr(1, _value.univers.length - 1);
    			_value.num = universObj.num;
     
    			return  _value;
    		} 
     
    		override protected function doValidation(value:Object):Array 
    		{			
    			_results = super.doValidation(value.pseudo);
     
    			_ro.destination = "zend";
    			_ro.source = "ServiceClasse";
    			_ro.addEventListener(ResultEvent.RESULT, result);
    			_ro.addEventListener(FaultEvent.FAULT, fault);
    			_ro.isUniquePseudo(value);	
     
    			return _results;
    		}
     
    		private function result(event:ResultEvent):void
    		{
    			_eventResult.result = event.result as Boolean;
    		}
     
    		private function fault(event:FaultEvent):void
    		{
    			_eventResult.fault = event.fault as Boolean;
    		}
     
    		override protected function handleResults(errorResults:Array):ValidationResultEvent
    		{
     
    			if( (_eventResult.result != undefined) && (_eventResult.result == false) )
    				errorResults.push(new ValidationResult(true, null, "PasUnique",	"Le pseudo entré existe déjà sur l'univers " + _value.universCap));	
     
    			if( (_eventResult.fault != undefined) && (_eventResult.fault == false) )
    				errorResults.push(new ValidationResult(true, null, "ErreurServeur",	"Une erreur serveur est survenue lors de la validation du compte"));
     
    			var resultEvent:ValidationResultEvent = super.handleResults(errorResults);
     
    			return resultEvent;
     
    		}
     
    	}
    }
    Merci à celui qui me mettra sur la voie


    EDIT: et le code de ma fonction PHP :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public function isUniquePseudo($objet) {
     
            /* Connexion à ma base (multiples bdd) */
            $this->connexionBase($objet->univers, $objet->num);
     
            $statement = $this->_connexion->prepare('SELECT COUNT(*) as total FROM users WHERE username = :username');
            $statement->bindParam(':username', $objet->pseudo);
            $statement->execute();
     
            if ($statement->fetchObject()->total == 0)
                return true;
     
            return false;
        }

  4. #4
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bon finalement, je m'en suis sorti en effectuant ma requête non pas dans mon validateur mais dans mon mxml et ensuite j'exécute mon validateur dans le result ou le fault de mon service en lui fournissant la valeur booléenne obtenue par mon service

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/02/2008, 18h40
  2. [JTable] Sortir du mode "edition"
    Par goboben dans le forum Composants
    Réponses: 12
    Dernier message: 05/02/2008, 16h01
  3. sortir du mode archivelog
    Par big1 dans le forum Oracle
    Réponses: 5
    Dernier message: 26/10/2006, 15h17
  4. [debutant]sortir du mode console
    Par gusgus dans le forum Débuter
    Réponses: 4
    Dernier message: 09/03/2006, 17h55
  5. [.NET] Une question technique a propos du mode asynchrone
    Par nicknolt dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 08/06/2004, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo