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

JavaScript Discussion :

[DWR] Fonction callback et variable globale


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut [DWR] Fonction callback et variable globale
    Bonjour à tous,

    Je développe actuellement une application en JSPs/Servlets et utilise DWR pour une certain nombre de contrôles.

    Je souhaite récupérer la valeur de retour d'une fonction DWR et l'affecter à une variable globale JS mais j'ai irrémédiablement undefined quand je fais appel à celle-ci...

    Je déclare une variable globale suivi du code de ma fonction callback :
    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
            ...
            var test;
     
            function dwrCheckUsername() {        
                var username=document.getElementById("empUserName").value;
     
    	    Dwr.checkUsername(username, function(data) { // ici ma fonction DWR qui fonctionne à merveille
    	        dwr.util.setValue("empUserName", data);
    	        if (username!=data) {
    	            test="Login déjà pris";
    	        }
                    else {
    	            test="Login valide";
    	        }	  	  
    	    }); 
            }
            ...
    La portion de code de ma JSP où j'appele la fonction dwrCheckUsername() :
    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
            ...
            <script type='text/javascript'>
            var test;
     
            function dwrCheckUsername() {        
                var username=document.getElementById("empUserName").value;
     
    	    Dwr.checkUsername(username, function(data) {
    	        dwr.util.setValue("empUserName", data);
    	        if (username!=data) {
    	            test="Login déjà pris";
    	        }
    	        else {
    		    test="Login valide";
    	        }	  	  
                 });
            } 
     
            function checkForm() { // fonction appelée sur le onsubmit
                 dwrCheckUsername();
                 alert("Test : " + test); // undefined
            }
            </script>
            ...
    Là où le bas blesse ce que ma variable test n'est donc jamais valorisée...

    Je voudrais bien comprendre...

  2. #2
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Que fait ta fonction Dwr.checkUsername ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut
    Salut Romain,

    Ma fonction Dwr.checkUsername prend en paramètre une string (une saisie provenant d'un input type="text") et vérifie en base si cette string (il s'agit d'un login pour le coup) est présente... ou pas...

    La dite fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public String checkUsername(String username) {
        String checkLogin = FormMgmt.checkLogin(username);
        return checkLogin;
    }
    La fonction FormMgmt.checkLogin(username) :
    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
    public static String checkLogin(String username) {
        List<String> lUsername=getListUsernane ();
        username=existUsernameOrEmail(username, lUsername, 1);
        return username;          
    }
     
    public static String existUsernameOrEmail(String usernameOrEmail, List<String> lString, int cpt) {   
        if(lString.contains(usernameOrEmail)) {
            if (usernameOrEmail.contains("@")) {
        	    return "Email existant... veuillez en changer.";
        	}
     
        	usernameOrEmail+=cpt;
            usernameOrEmail=existUsernameOrEmail(usernameOrEmail, lString, cpt++);
    	return usernameOrEmail;
        }
        else {
            return usernameOrEmail;
        }    	
    }
    Le résultat attendu de la fonction Dwr.checkUsername est le bon.

    Je veux donc capter le retour de cette fonction (une string) pour l'affecter à une variable globale JS.

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function checkForm() { // fonction appelée sur le onsubmit
        dwrCheckUsername();
        alert("Test : " + test); // undefined
    }
    Un grand classique

    Manifestement, tu lances un appel AJAX pour vérifier la validité de ton username sur le serveur.
    Donc la valeur de test ne sera modifiée qu'une fois la réponse reçue, ce qui n'est certainement pas le cas au moment de l'alert !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut
    Effectivement Bovino, je dirai même mieux LE grand classique !

    J'ai quand même fait pas mal de recherches avant de poster.

    Je suis tombé sur le principe des fonctions callback.

    Pour moi (mais du coup je me fourvoie très certainement), la fonction dwrCheckUsername (dans laquelle se trouve Dwr.checkUsername) est une fonction callback que j'appele plus tard dans mon code (dans checkForm) et qui, selon la compréhension que j'en ai, devrait me valoriser ma variable test.

    J'ai bien compris que le retour de ma fonction Java est renvoyé bien plus tard dans mon code JS alors que ce dernier est passé à autre chose depuis bien longtemps...

    Et je n'ai pas trouvé d'exemple suffisamment explicite/clair sur LA bonne façon de faire...

  6. #6
    Membre actif
    Inscrit en
    Août 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 78
    Par défaut
    Bonjour ,

    je ne sais pas pourquoi le code suivant ne m'affiche rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <input value="click" type="button" onclick="update();"/>
    <div id="divvr"></div>
     
    <script >
     
    function udpate(){
    test.getA(function(data){
     
    dwr.util.setValue("divvr",data);});}
     
     
    </script>


    sachant que test est le bean declaré dans dwr.xml et la methode getA() retourne une chaine de caratere

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public String getA()
    {
    return "extjs";
    }
    et

  7. #7
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par ayoubkira Voir le message
    sachant que test est le bean declaré dans dwr.xml
    tu déclares une variable js dans ... un xml. ? Je ne vois pas bien comment elle va se téléporter dans le contexte de la page...
    Citation Envoyé par ayoubkira Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function udpate(){
    test.getA(function(data){
     
    dwr.util.setValue("divvr",data);});}
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public String getA()
    {
    return "extjs";
    }
    pourquoi passer une fonction en paramètre à getA puisque cette dernière ne l'utilise pas et renvoie systématiquement la même chaine ? Et de toutes façons, le retour de la fonction getA n'est même jamais utilisé...

  8. #8
    Membre actif
    Inscrit en
    Août 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 78
    Par défaut
    ben c'est un tuto que j'ai suivi ...
    Pour relier java avec extjs il faut passer par le framework dwr ( càd à travers le fichier dwr.xml)

    Dans mon fichier dwr.xml , j'ai declaré mon bean selon la facon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      <create creator="spring"  javascript="test">
    <param name="beanName"  value="Atest" />
    </create>
     
    <convert converter="bean" match="package.*"/>
    et je veux utiliser test dans mon fichier .js

    Comment faire!!!!

Discussions similaires

  1. [Python 2.X] utiliser l' élement de la fonction1 dans la fonction 2 sans variable globale!
    Par davidmir dans le forum Général Python
    Réponses: 19
    Dernier message: 12/09/2014, 14h55
  2. Réponses: 6
    Dernier message: 03/02/2010, 14h00
  3. Changer valeur variable global dans une fonction callback
    Par bog333 dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 02/10/2008, 15h14
  4. Variable Globale dans une fonction
    Par rekiem71 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 18/01/2007, 17h12
  5. Variables globales dans une fonction?
    Par Death83 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/07/2006, 01h53

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