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 :

Partage de variable entre fonction


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut Partage de variable entre fonction
    Bonjour à tous,

    Voilà, j'ai un script js me permettant de récupérer via ajax (j'utilise jQuery pour plus de facilité) une valeur que je doit ensuite mettre dans un attribut de l'objet duquel découle cette même fonction.
    L'ennui, c'est que JS n'arrive pas à faire une chose pareil. Serais-ce une histoire de callback ? (pas bien compris le principe).

    Mon script :
    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
     
    var monObj = function(){
        var maVar = null; // Attribut privé à changer
     
        sendAjaxRequest     = function(){
            $.ajax({
                url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
                type        : "POST",
                data        : "bla=blabla",
                cache       : false,
                success     : function(valR){
                    if(valR!==0 && valR!==null){
                        maVar         = valR;
                    }
                }
            });
     
            return (maVar!==null); // CE TEST VAUT FALSE !!!
        }
    };
    En gros, l'attribut maVar doit se faire remplacer par le résultat de ma requette, mais impossible...
    Je précise que le problème ne viens pas d'ajax qui me retourne la bonne valeur comme prévu. Je n'arrive juste pas bien a comprendre la portée des variables en objet dans js...

    D'avance merci pour votre aide...
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 662
    Points
    66 662
    Billets dans le blog
    1
    Par défaut
    essaye de attacher ta variable à la fonction ..
    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
    var monObj = function(){
        this.maVar = null; // Attribut privé à changer
     
        sendAjaxRequest     = function(){
            $.ajax({
                url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
                type        : "POST",
                data        : "bla=blabla",
                cache       : false,
                success     : function(valR){
                    if(valR!==0 && valR!==null){
                        monObj.maVar         = valR;
                    }
                }
            });
     
            return (nomObj.maVar!==null); // CE TEST VAUT FALSE !!!
        }
    };
    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
    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 : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Ben surtout, attends d'avoir récupéré la valeur avant d'essayer de l'affecter...
    Un classique AJAX : utiliser les données au bon moment !

    JS n'arrive pas à faire une chose pareil

    Ce serait pas plutôt : "je n'arrive pas à faire une chose pareille avec JS" ?
    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

  4. #4
    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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 662
    Points
    66 662
    Billets dans le blog
    1
    Par défaut
    ha oui le return dans le success ^^
    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 !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Merci à vous deux.

    Citation Envoyé par Bovino

    Ce serait pas plutôt : "je n'arrive pas à faire une chose pareille avec JS" ?
    En effet :p

    @SpaceFrog : Si je fais ce que tu préconise, maVar n'est alors plus un attribut privé et se voi donc accessible et modifiable a l'extérieur de l'objet, ce que je ne souhaite absolument pas...
    De plus, il me semble que faire un return dans une fonction anonyme est déprécié...

    @Bovino : Merci pour le lien. Il est vrai que je fais (hélas) encore ce genre d'erreur de base... Que préconises-tu dans ce contexte alors ? Car mettre l'instruction ajax dans une autre fonction serait juste inutile à mon sens puisque j'en ai besoin uniquement pour cette fonction.


    Plus généralement, travaillant avec Komodo Edit, ce dernier m'a indiqué le problème de return dans le success ajax. Est-ce un réel problème ? Quels changements implique ?

    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
     
    var monObj = function(){
        var maVar = null; // Attribut privé à changer
     
        sendAjaxRequest     = function(){
            $.ajax({
                url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
                type        : "POST",
                data        : "bla=blabla",
                cache       : false,
                success     : function(valR){
                    return (valR!==0 && valR!==null) ? valR : null;
                }
            });
     
            // Je met quoi ici ? maVar = valR; ou maVar = avant le $.ajax ?
     
            return (maVar!==null); // CE TEST VAUT FALSE !!!
        }
    };
    D'avance merci...
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  6. #6
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par FotoXe33 Voir le message
    Bonjour à tous,

    Voilà, j'ai un script js me permettant de récupérer via ajax (j'utilise jQuery pour plus de facilité) une valeur que je doit ensuite mettre dans un attribut de l'objet duquel découle cette même fonction.
    L'ennui, c'est que JS n'arrive pas à faire une chose pareil. Serais-ce une histoire de callback ? (pas bien compris le principe).

    Mon script :
    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
     
    var monObj = function(){
        var maVar = null; // Attribut privé à changer
     
        sendAjaxRequest     = function(){
            $.ajax({
                url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
                type        : "POST",
                data        : "bla=blabla",
                cache       : false,
                success     : function(valR){
                    if(valR!==0 && valR!==null){
                        maVar         = valR;
                    }
                }
            });
     
            return (maVar!==null); // CE TEST VAUT FALSE !!!
        }
    };
    En gros, l'attribut maVar doit se faire remplacer par le résultat de ma requette, mais impossible...
    Je précise que le problème ne viens pas d'ajax qui me retourne la bonne valeur comme prévu. Je n'arrive juste pas bien a comprendre la portée des variables en objet dans js...

    D'avance merci pour votre aide...
    essaye simplement d'ajouter à ton code initial, le paramètre async : false à ta requête ajax. (je pense que ça devrait résoudre ton problème, même si les requêtes synchrones ne sont pas ce qu'il y a de mieux puisqu'elles bloquent ton code jusqu'à l'obtention d'une réponse.)
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par Willpower Voir le message
    essaye simplement d'ajouter à ton code initial, le paramètre async : false à ta requête ajax. (je pense que ça devrait résoudre ton problème, même si les requêtes synchrones ne sont pas ce qu'il y a de mieux puisqu'elles bloquent ton code jusqu'à l'obtention d'une réponse.)
    Une méthode qui fait de l'ajax est asynchrone, donc elle ne doit pas retourner de valeur, mais plutôt appeler une methode de callback qui recevra cette valeur en paramètre.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par Willpower Voir le message
    essaye simplement d'ajouter à ton code initial, le paramètre async : false à ta requête ajax. (je pense que ça devrait résoudre ton problème, même si les requêtes synchrones ne sont pas ce qu'il y a de mieux puisqu'elles bloquent ton code jusqu'à l'obtention d'une réponse.)
    Ah oui pas bête, à tester...

    Citation Envoyé par dukej Voir le message
    Une méthode qui fait de l'ajax est asynchrone, donc elle ne doit pas retourner de valeur, mais plutôt appeler une methode de callback qui recevra cette valeur en paramètre.
    Oui c'est ce que je souhaitais faire à la base mais j'avoue ne pas avoir tout compris du callback :/ J'vais me taper un p'tit tutos et essayer de voir ça...
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  9. #9
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    ce qu'on appelle "callback" n'est autre que la fonction qu'on exécute lorsqu'on reçoit la réponse du serveur.

    dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     success     : function(valR){
                    if(valR!==0 && valR!==null){
                        maVar         = valR;
                    }
                }
    EST la fonction de callback. c'est à partir de là que tu dois déclencher les mises à jour de ta page.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Dans mon cas impossible...

    Quant à async : false, marche pas :/
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  11. #11
    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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 662
    Points
    66 662
    Billets dans le blog
    1
    Par défaut
    il suffit de faire le return dans le success ...
    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 !

  12. #12
    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 : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par SpaceFrog
    il suffit de faire le return dans le success ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    success: function(){...}
    Non, ce n'est pas possible, si tu mets le return dans le callback success, c'est la fonction anonyme qui va renvoyer sa réponse, donc pas la fonction de départ (d'ailleurs, celle-ci à logiquement terminé son exécution).

    @FotoXe33 : si pour toi attendre la réponse du serveur n'est pas une option possible, ni en synchrone ni en asynchrone, il te reste plus qu'à te tirer une balle dans le sexe !
    Plus sérieusement, il doit y avoir une solution, mais pour t'aider, il faudrait nous en dire plus sur ce que tu cherches à faire...
    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

  13. #13
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par FotoXe33 Voir le message
    Dans mon cas impossible...
    quoi donc ? la solution du callback ? tu souhaites donc que ta fonction soit blocante en attendant la réponse ? donc synchrone (async:false) ?

    Citation Envoyé par FotoXe33 Voir le message
    Quant à async : false, marche pas :/
    Attention de ne pas mélanger les différentes solutions qu'on t'as proposé, pour l'ajout du paramètre async:false je t'ai bien précisé de reprendre ton code initial. (donc avec modification de variable et non retour dans la fonction succes) :


    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
    var monObj = function(){
        var maVar = null; // Attribut privé à changer
     
        sendAjaxRequest     = function(){
            $.ajax({
                url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
                type        : "POST",
                data        : "bla=blabla",
                cache       : false,
                async       : false,
                success     : function(valR){
                    if(valR!==0 && valR!==null){
                        maVar         = valR;
                    }
                }
            });
     
            return (maVar!==null); // CE TEST VAUT FALSE !!!
        }
    };
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par Bovino Voir le message
    @FotoXe33 : si pour toi attendre la réponse du serveur n'est pas une option possible, ni en synchrone ni en asynchrone, il te reste plus qu'à te tirer une balle dans le sexe !
    Plus sérieusement, il doit y avoir une solution, mais pour t'aider, il faudrait nous en dire plus sur ce que tu cherches à faire...
    Oui je vais éviter l'option de la balle :p
    Si c'est possible, je veux attendre la réponse, et ne marche pas :/

    Citation Envoyé par Willpower Voir le message
    Attention de ne pas mélanger les différentes solutions qu'on t'as proposé, pour l'ajout du paramètre async:false je t'ai bien précisé de reprendre ton code initial.
    Oui je n'allait pas mélanger tout. J'avais déjà le code que tu as posté mais sans succès :s
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  15. #15
    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 : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Oui je vais éviter l'option de la balle :p

    Je sais pas pourquoi, mais je ne suis pas étonné !

    Sinon, décris-nous un peu mieux ce que tu souhaites faire
    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

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Bon le principe :

    Une fonction qui génére un identifiants unique à partir de certains éléments.

    FONCTION GENERER{
        SI laClef N'EST PAS GENERER
            laClef = ENVOIE_REQUETTE_AJAX()
            retour = GENERER();
        SINON
            test = ENVOIE_REQUETTE_AJAX(laClef) // Pour tester si la clef est ok
            SI test===VRAI
                retour = laCLef;
            SINON
                retour = FAUX;
            FIN SI
        FIN SI
    }
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  17. #17
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Honni sois-tu, Willpower, d'avoir suggéré de l'Ajax synchrone ! Il y a toujours moyen de faire autrement.

    @FotoXe33, je pense que tu as un problème avec les objets en JavaScript. Pour être précis, je pense que tu confonds la déclaration de la classe (ou plutôt du constructeur), et l'instanciation de l'objet.

    Par exemple, ceci est un constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var Bidule = function( poids, couleur ) {
    	this.poids = poids;
    	this.couleur = couleur;
    }
    Et ceci est une instanciation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var monBidule = new Bidule('500kg', 'rose');
    Actuellement, ta variable monObj reçoit la fonction anonyme que tu as écrite, autrement dit monObj est une fonction ! De plus, si tu exécutes cette fonction, la variable maVar ne sera visible de personne, et la variable sendAjaxRequest sera globale. Ce n'est sans doute pas ce que tu veux obtenir.

    Si j'ai bien compris, tu veux lancer une requête Ajax au moment où tu construis ton objet. Ce que je vais dire va t'aider à comprendre les callbacks, je pense.

    Une requête Ajax c'est un peu comme un expresso : tu appuies sur le bouton et, en attendant que le café soir servi, tu fais autre chose. Maintenant, suppose que tu as une cafetière hyper moderne capable de se déplacer et de t'apporter ton café. En plus de ça, elle est relativement intelligente et comprend les ordres que tu lui donnes.
    Si tu appuies sur le bouton et que tu lui dis « apporte-moi mon café », elle va t'apporter ton café tout de suite alors qu'il n'est pas forcément prêt. C'est ce que fait ton script actuellement.
    Par contre, si tu lui dis « apporte-moi mon café quand il sera prêt », elle va attendre que le café soit prêt avant de te l'apporter. C'est ce que font les fonctions de callback.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $.preparerCafe({
    	type: 'expresso',
    	force: 'bien serré',
    	sucre: 'pas trop',
    	success: function( cafePret ) {
    		apporterCafe(cafePret);
    	}
    });
    Comme je n'ai pas exactement compris ce que tu cherches à faire, je vais te laisser chercher une solution à la lumière de ce que je viens de t'apprendre.

    Une dernière chose :
    Pourquoi pas :
    ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  18. #18
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par FotoXe33 Voir le message
    Bon le principe :

    Une fonction qui génére un identifiants unique à partir de certains éléments.

    FONCTION GENERER{
    SI laClef N'EST PAS GENERER
    laClef = ENVOIE_REQUETTE_AJAX()
    retour = GENERER();
    SINON
    test = ENVOIE_REQUETTE_AJAX(laClef) // Pour tester si la clef est ok
    SI test===VRAI
    retour = laCLef;
    SINON
    retour = FAUX;
    FIN SI
    FIN SI
    }
    je ne suis pas sûr d'avoir tout compris, mais sous forme de callback, je te proposerai une solution comme ceci :
    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
    var key;
    function suite_execution(){
    	...
    }
    function suite_execution_negative(){
    	...
    }
    function tester(){
    	$.ajax({
    		...:__,
    		...:__,
    		succes:function(obj){
    			if(obj===true)
    				suite_execution();
    			else
    				suite_execution_negative();
    		}
    	});
    }
    function generer(){
    	if(!key){
    		 $.ajax({
    			...:__,
    			...:__,
    			succes:function(obj){
    				key = obj;
    				tester();
    			}
    		 });
    	}
    	else{
    		tester();
    	}
    }
    generer();

    Citation Envoyé par Watilin Voir le message
    Honni sois-tu, Willpower, d'avoir suggéré de l'Ajax synchrone ! Il y a toujours moyen de faire autrement.
    je sais, j'ai eu moi-même un peu honte.

    mais bon, je lui offrais une solution simple où il n'avait qu'à rajouter un paramètre booléen.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par Watilin Voir le message
    @FotoXe33, je pense que tu as un problème avec les objets en JavaScript. Pour être précis, je pense que tu confonds la déclaration de la classe (ou plutôt du constructeur), et l'instanciation de l'objet.

    Par exemple, ceci est un constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var Bidule = function( poids, couleur ) {
    	this.poids = poids;
    	this.couleur = couleur;
    }
    Et ceci est une instanciation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var monBidule = new Bidule('500kg', 'rose');
    J'ai eut pendant 2 ans des cours objets, tkt je fais très bien la différence C'est avec js que je suis un peut pommé...

    Citation Envoyé par Watilin Voir le message
    Actuellement, ta variable monObj reçoit la fonction anonyme que tu as écrite, autrement dit monObj est une fonction ! De plus, si tu exécutes cette fonction, la variable maVar ne sera visible de personne, et la variable sendAjaxRequest sera globale. Ce n'est sans doute pas ce que tu veux obtenir.
    Mon objet EST instancié ! Tout de même ! Et si, je VEUX que maVar ne soit accessible qu'à l'intérieur de l'objet. Idem pour sendAjaxRequest...

    Citation Envoyé par Watilin Voir le message
    Si j'ai bien compris, tu veux lancer une requête Ajax au moment où tu construis ton objet.
    Absolument pas :/ Je souhaite lancé ma requette quand j'appelle ma fonction sendAjaxRequest, lors de la génération de la clef...

    Citation Envoyé par Watilin Voir le message
    Ce que je vais dire va t'aider à comprendre les callbacks, je pense.

    Une requête Ajax c'est un peu comme un expresso : tu appuies sur le bouton et, en attendant que le café soir servi, tu fais autre chose. Maintenant, suppose que tu as une cafetière hyper moderne capable de se déplacer et de t'apporter ton café. En plus de ça, elle est relativement intelligente et comprend les ordres que tu lui donnes.
    Si tu appuies sur le bouton et que tu lui dis « apporte-moi mon café », elle va t'apporter ton café tout de suite alors qu'il n'est pas forcément prêt. C'est ce que fait ton script actuellement.
    Par contre, si tu lui dis « apporte-moi mon café quand il sera prêt », elle va attendre que le café soit prêt avant de te l'apporter. C'est ce que font les fonctions de callback.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $.preparerCafe({
    	type: 'expresso',
    	force: 'bien serré',
    	sucre: 'pas trop',
    	success: function( cafePret ) {
    		apporterCafe(cafePret);
    	}
    });
    Comme je n'ai pas exactement compris ce que tu cherches à faire, je vais te laisser chercher une solution à la lumière de ce que je viens de t'apprendre.
    Merci pour cette explication par contre, car le callback je voyais plus ou moins ce que c'était mais sans plus. L'idée d’appeler une fonction dedans le callback est loin d'être con, j'y avait pas du tout pensé (mais bon une fonction qui sert juste à mettre une valeur dans un attribut d'objet ça fait chier, 'fin bref...)

    Citation Envoyé par Watilin Voir le message
    Une dernière chose :
    Pourquoi pas :
    ?
    Euh bonne question xD C'est exactement la même valeur ? Et si cette page est appelé via ajax ça marche quand même avec location.href ?

    Citation Envoyé par Willpower Voir le message
    je ne suis pas sûr d'avoir tout compris, mais sous forme de callback, je te proposerai une solution comme ceci :
    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
    var key;
    function suite_execution(){
    	...
    }
    function suite_execution_negative(){
    	...
    }
    function tester(){
    	$.ajax({
    		...:__,
    		...:__,
    		succes:function(obj){
    			if(obj===true)
    				suite_execution();
    			else
    				suite_execution_negative();
    		}
    	});
    }
    function generer(){
    	if(!key){
    		 $.ajax({
    			...:__,
    			...:__,
    			succes:function(obj){
    				key = obj;
    				tester();
    			}
    		 });
    	}
    	else{
    		tester();
    	}
    }
    generer();
    Hélas, cela ne convient pas du tout à ma situation :/ Je sais que sans mon code exacte c'est un peut dure de tout comprendre mais je ne peut pas trop en dire plus pour le moment (expérimental :p)


    Après plusieurs test (dont la solution de Watilin) et n'ayant pas de résultats plus concluant je vais tenter de mieux me faire comprendre.

    J'ai une classe maClass ayant pour contenu :
    • Un attribut maClef
    • Un attribut generer (booléen) pour tester si la clef a déjà été générée
    • Un attribut time car j'ai mit une expiration de la clef
    • Une methode testTime(nbSecAuMax) pour tester si la clef a été généré il y a moins nbSecAuMax
    • Une méthode sendAjaxRequest pour envoyer les requettes
    • Une méthode générer_clef() qui génére, test, puis retourne la clef
    • Une méthode definir_clef() qui prends un paramètre ou non. Si un paramètre est présent (la clef), on définit la valeur de l'attribut maClef par le paramètre reçut. Dans tous les cas (paramètre ou non), on a return (maClef!==null);


    Je précise que SEUL générer_clef() doit être PUBLIC.

    On instancie (var monObj = new maClass();) puis on génére comme cela : var laClefGénérée = monObj.générer_clef();Il faut donc que générer_clef() ait l'algo suivant :
    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
     
    var valeurRetournée = false;
     
    if(maClef === null && "test du temps"){
        time = "le temps actuelle";
        sendAjaxRequest();
        if(definir_clef()===true){
            valeurRetournée = générer_clef(); // A savoir cette fonction
        }
    }
    else{
        sendAjaxRequest();
        valeurRetournée = (definir_clef()===true) ? vid : false;
    }
     
    return valeurRetournée;
    Pour se la jouer à la AOE2, "de l'aide, merci" :p
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  20. #20
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 961
    Points : 44 133
    Points
    44 133
    Par défaut
    lu un peu en diagonal mais une deux réflexions me viennent

    1ére réflexion :
    pourquoi ne pas traiter coté serveur la validité de la clef?
    si on envoi null alors après test on en génère une et on la retourne, dans le cas contraire j'informe que c'est OK.

    2éme réflexion :
    si tu es en asynchrone tu vas avoir intérêt à donner une adresse de retour à ta fonction, car retourner une valeur c'est bien dans le vide c'est moyen. Cela peut être l'appel à une méthode de ton objet qui va elle atteindre ta variable.

Discussions similaires

  1. Partager des variables entre plusieurs actions ds un controlleur
    Par gvdmoort dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 11/10/2007, 09h38
  2. Partage de données entre fonctions
    Par 13mike dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2007, 11h46
  3. Partage de variables entre fichier .jsp
    Par stephou85 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/05/2007, 09h59
  4. Problème d'appels d'une variable entre fonctions
    Par julien.nasser dans le forum MFC
    Réponses: 12
    Dernier message: 26/04/2006, 09h23
  5. Partage de variables entre plusieurs pages
    Par bud_gw dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 27/12/2005, 15h42

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