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 :

variable globale et résultat local


Sujet :

JavaScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut variable globale et résultat local
    Bonjour à tous,
    pourquoi le résultat n'est pas celui souhaité :
    voici mon code :
    ------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //une fonction callback:
    function getData(str)//str='new_value'
    {
    	mydata=str;
    }
    var mydata="init_value";
    getData étant une fonction callback donc ne fait pas de return (dans mon cas)
    donc je voulais procèder via une variable globale!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    alert(mydata);
    //affiche "init_value" or je veux 'new_value'
    //comment faire
    Merci à tous d'avance !

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    Heu je ne vois pas le problème ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <script type="text/javascript">
     mydata="init_value";
    function getData(mystr){
     mydata=mystr
    }
     
    getData("new_value")
    alert(mydata)
     
    </script>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    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 zenzo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //...
    var mydata="init_value";
    ... donc je voulais procèder via une variable globale! ...
    Le mot-clef "var" avant l'identifiant de ta variable en fait précisément une variable locale ; retire ce mot-clef pour avoir une globale (mais cette pratique est déconseillée quand on peut faire autrement).
    En même temps, comme nous ignorons pourquoi tu préfères utiliser une globale... difficile d'être plus précis ^^

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut
    Citation Envoyé par RomainVALERI Voir le message
    Le mot-clef "var" avant l'identifiant de ta variable en fait précisément une variable locale ; retire ce mot-clef pour avoir une globale (mais cette pratique est déconseillée quand on peut faire autrement).
    En même temps, comme nous ignorons pourquoi tu préfères utiliser une globale... difficile d'être plus précis ^^
    Bonjout tout le monde,
    merci d'abord pour vos réponses masi me suis-je bien expliqué?
    je vous redonne le contexte réel :
    j'utilise la librairie jquery et j'ai une fonction qui me fait un appel ajax de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $.post(DEF_URL_PROJET, {},getData, "json");
    getData étant une fonction callback
    on pourrait écrire si on veut (si pas pas beaucou de traitemet) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var mydata="init_value";
    $.post(DEF_URL_PROJET, {},function(result)
    {
       mydata=result;
    }
    , "json");
     
    alert(mydata) // donne "init_value";
    j'espère avoir donner plus de précision !
    merci d'avance !

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $.post(DEF_URL_PROJET, {},function(result)
    {
       window['mydata']=result;
    }
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    C'est de l'ajax, donc asynchrone. L'alerte intervient avant le retour de la requête! Il faut mettre l'alerte dans le callback.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut
    Citation Envoyé par franculo_caoulene Voir le message
    C'est de l'ajax, donc asynchrone. L'alerte intervient avant le retour de la requête! Il faut mettre l'alerte dans le callback.
    mais non l'alerte est un exemple, l'application ne fonctionne pas avec des alertes!
    mon souci si tu as bien suivi le problème est d'alimenter une variable globale!
    merci quand même !

  8. #8
    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
    Je ne connais pas bien jquery, mais avec Prototype il y a une fonction defer() qui permet de retarder une exécution le temps que le DOM soit bien chargé... peut-être existe-t-il un équivalent dans jquery ?

    edit : en effet, après vérification, au temps pour moi, cela n'a rien à voir avec le dom (si on veut), mais ça permet bien de retarder l'exécution d'une fonction, le temps que la pile d'appels de l'interpréteur se vide.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut
    Citation Envoyé par RomainVALERI Voir le message
    Je ne connais pas bien jquery, mais avec Prototype il y a une fonction defer() qui permet de retarder une exécution le temps que le DOM soit bien chargé... peut-être existe-t-il un équivalent dans jquery ?
    cela n'a rien avoir avec dom !
    merci quand même !

  10. #10
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Par défaut
    Citation Envoyé par zenzo Voir le message
    mais non l'alerte est un exemple, l'application ne fonctionne pas avec des alertes!
    mon souci si tu as bien suivi le problème est d'alimenter une variable globale!
    merci quand même !
    Je suis d'accord avec franculo_caoulene, ta variable ne se met à jour qu'après l'appel de la fonction callback, il est donc normal que ta variable n'ait pas changé de valeur... (en tout cas pas tout de suite).
    Il faudrait faire un appel AJAX en synchrone pour que ton code "linéaire" fonctionne ou mettre la suite dans la fonction callback pour être sûr que ta variable a changé de valeur.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut
    je crois que personne n'a vraiment compris le problème (j'ai peut-être mal expliqué le problème?)
    j'utilise ajax dans pas mal d'application et je n'ai aucun problème de ce côté.
    Merci à tous pour vos réponses !
    c'est juste que alimenter une variable globale à partie d'une focntion callback cause problème !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var mydata="init_value";
    //ce code s'execute immédiatemet et la fonction function(result etc
    //récupère le résultat
    //je pourrais faire le traitement dedans mais exceptionnellement je souhaiterais
    //juste alimenter mydata par result
    $.post(DEF_URL_PROJET, {},function(result)
    {
       mydata=result;
    }
    , "json");
     
    alert(mydata) // donne "init_value";

  12. #12
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Si tu essaies ça, qu'est-ce que ça fait?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var mydata="init_value";
    $.post(DEF_URL_PROJET, {},function(result) {
       mydata=result;
       alert(mydata +" dans le callback");
    }
    , "json");
     
    alert(mydata +" hors du callback"); // donne "init_value";
    Quelle alerte arrive en premier?

  13. #13
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Salut,

    tu peux donner un code complet qui présente le problème qu'on puisse tester ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut
    Citation Envoyé par franculo_caoulene Voir le message
    Si tu essaies ça, qu'est-ce que ça fait?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var mydata="init_value";
    $.post(DEF_URL_PROJET, {},function(result) {
       mydata=result;
       alert(mydata +" dans le callback");
    }
    , "json");
     
    alert(mydata +" hors du callback"); // donne "init_value";
    Quelle alerte arrive en premier?
    Bonjour,
    alert dans le callback fonctionne bien sûr mais ce que je veux est alimenter mydata par result ainsi mydata a la nouvelle valeur !

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut
    Citation Envoyé par marcha Voir le message
    Salut,

    tu peux donner un code complet qui présente le problème qu'on puisse tester ?
    bonjour,
    cela sera un peu contraingnant car il faut intégrer la lib jquery et un fichier php pour le retour de résultat;
    j'essaierai de faire une petite archive si vous le voulez !
    merci pour vos réponses !

  16. #16
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    JQuery on sait ou trouver (donne éventuellement la version) maintenant ton code
    ne devrait pas être influencé par le contenu retourné (sauf si le fragment chargé contient un javascript, est-ce le cas ?)

  17. #17
    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
    Citation Envoyé par zenzo Voir le message
    ce que je veux est alimenter mydata par result ainsi mydata a la nouvelle valeur !
    C'est ce qui se produit dans ton code, seulement comme on te l'a déjà expliqué, tu sembles utiliser cette valeur avant la réponse Ajax, donc avant que ta variable soit actualisée.
    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

  18. #18
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par Bovino Voir le message
    C'est ce qui se produit dans ton code, seulement comme on te l'a déjà expliqué, tu sembles utiliser cette valeur avant la réponse Ajax, donc avant que ta variable soit actualisée.
    +1

    les alert() de franculo_caoulene te donnent la chronologie à respecter : tu as tous les éléments (depuis hier matin) ...

    A+

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut
    Citation Envoyé par E.Bzz Voir le message
    +1

    les alert() de franculo_caoulene te donnent la chronologie à respecter : tu as tous les éléments (depuis hier matin) ...

    A+
    je vous envoie le code :
    créer à la racine pour le test un fichier test.php
    avec un echo ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var mydata="init_value";
               function getData(result)
               {
                    mydata=result;
               }
               $.ajaxSettings.url='test.php';
               $.ajaxSettings.success=getData;
               $.ajax();
               //test
               alert(mydata);
    merci d'avance !

  20. #20
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    A lire ton code, je vois rien de neuf par rapport à avant.

    ton alert() de la fin s'exécute avant le mydata=result;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de variables globales / locales
    Par onigami dans le forum Général Java
    Réponses: 9
    Dernier message: 06/03/2008, 14h01
  2. Réponses: 7
    Dernier message: 15/11/2007, 14h41
  3. Variable globale et locale
    Par momo70 dans le forum MATLAB
    Réponses: 1
    Dernier message: 03/07/2007, 09h49
  4. variables globales ou locales
    Par exhortae dans le forum C
    Réponses: 6
    Dernier message: 09/04/2007, 01h29
  5. variable globale ou locale pour CurrentDB
    Par jibouze dans le forum VBA Access
    Réponses: 7
    Dernier message: 30/05/2006, 17h15

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