Partage
  • Partager sur Facebook
  • Partager sur Twitter

ordre d’exécution code javascript

Sujet résolu
    3 juillet 2019 à 15:32:40

    Bonjour à tous,

    Voilà j'ai un soucis en javascript, peut être basique pour certains, mais qui m’embête beaucoup là :(

    Voici l'idée de ce que je veux faire:

    function A(){
        var maVariable;
        B();// doit modifier la variable maVariable
        return maVariable;
    }

    Le truc c'est que cette fonction me renvoie undefined alors que B() est sensée modifier maVariable . En gros , il faut comprendre que B() s’exécute après mon return, alors que je veux que B() s’exécute avant, bien évidemment (quand je fais des tests avec des alert(), je met un entre B() et return et un dans B(). Celui dans B() apparaît en deuxième).

    Quelqu'un peut-il m'aider svp ? 

    • Partager sur Facebook
    • Partager sur Twitter

    La confiance en soi n'exclu pas le contrôle de son code.

      3 juillet 2019 à 15:45:54

      Ça renvoie undefined parce que tu n'as pas affecté de valeur à maVariable.

      B ne peux pas accéder à cette variable pour la modifier. Il faut que B renvoie une valeur que tu affectes en faisant :

      maVariable = B();



      -
      Edité par thelinekioubeur 3 juillet 2019 à 15:48:01

      • Partager sur Facebook
      • Partager sur Twitter
        3 juillet 2019 à 16:00:13

        Et bien, j'ai essayé en faisant :

        function A(){
            var maVariable = "init";
            B();// doit modifier la variable maVariable
            return maVariable;
        }

        Mais cela ne fonctionne pas. Je précise aussi que B() est une fonction qui ne renvoit rien.

        • Partager sur Facebook
        • Partager sur Twitter

        La confiance en soi n'exclu pas le contrôle de son code.

          3 juillet 2019 à 17:00:11

          Bah là ça renvoit "init" du coup, pas undefined
          • Partager sur Facebook
          • Partager sur Twitter
            3 juillet 2019 à 17:04:38

            Oui mais je voudrais qu'il prenne une valeur que B() doit lui conférer.

            En gros mon B() est une focntion ayant deux fonctions en parametre : un success et un error.

            Le success fonctionne avec un switch case qui va en fonction d'un cas ou d'un autre , affecter une valeur à maVariable. Mais apparemment mon traitement ne passe pas dans le bon ordre. :(

            • Partager sur Facebook
            • Partager sur Twitter

            La confiance en soi n'exclu pas le contrôle de son code.

              3 juillet 2019 à 18:18:03

              Bonjour PedroR. ,

              Tu déclares ta variable "maVariable" dans A() avec un var ta variable n'est donc visible que dans A() et pas dans B()

              Il faut la rendre globale

              var maVariable;
              function A(){
                  B();// doit modifier la variable maVariable
                  return maVariable;
              }



              • Partager sur Facebook
              • Partager sur Twitter
              Découvrez les Css avec la zonecss.fr
                4 juillet 2019 à 9:47:43

                En rendant maVariable globale, je reste confronté au meme problème : Le code de B() termine de s'executer après le return de A() :(
                • Partager sur Facebook
                • Partager sur Twitter

                La confiance en soi n'exclu pas le contrôle de son code.

                  4 juillet 2019 à 11:16:52

                  Il faut revoir la conception. Si B renvoie une promesse, il faut traiter maVariable une fois que la promesse est résolue.

                  Si tu expliquais ce que doivent faire A et B on pourrait mieux t'aider.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 juillet 2019 à 11:26:00

                    Je ne voulais pas vous embêter avec du code inutile ou difficile à comprendre. Je travaille sur une façon de récupérer des données dans un fichier sur un device qui tourne sous tizen. Voici ce que ca donne:

                        var dataToReturn = "init";//globale
                    function getDetail(detail){
                        var documentsDir;
                        tizen.filesystem.resolve("documents", function (dir) {
                       documentsDir = dir;
                                   var file = documentsDir.resolve("myFile.json");// On atteind le fichier cible
                                   file.openStream(
                                        "r", 
                                        function(fs) {
                                            var text = fs.read(file.fileSize);       
                                            fs.close();
                                            var obj  = JSON.parse(text);
                                            
                                            switch (detail){
                                            case "data1Value":
                                            dataToReturn = obj.data1;
                                            break;
                                           
                                            case "data2Value":
                                            dataToReturn = obj.data2;
                                            break;
                                           
                                            case "data3Value":
                                            dataToReturn = obj.data3;
                                            break;
                                           
                                            default:
                                            dataToReturn = null;
                                            }
                                        alert(dataToReturn);//alert qui apparait en 2e
                                        }, function (e) {
                                            alert("Error " + e.message);
                                        }, "UTF-8");
                            });
                            alert(dataToReturn);//alert qui apparait en 1er
                    return dataToReturn;
                    }



                    • Partager sur Facebook
                    • Partager sur Twitter

                    La confiance en soi n'exclu pas le contrôle de son code.

                      4 juillet 2019 à 13:45:01

                      Le point important c'est la fonction qui va appeler getDetail et qui va utiliser "dataToReturn".

                      Il faut que cette fonction attende le résultat.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 juillet 2019 à 14:05:06

                        La fonction qui appelle getDetail, c'est mon main ; je veux juste faire quelque chose du style :

                        var v= "data1Value";

                        v= getDetail(v);

                        • Partager sur Facebook
                        • Partager sur Twitter

                        La confiance en soi n'exclu pas le contrôle de son code.

                          4 juillet 2019 à 14:08:28

                          Si c'est ton main pourquoi ça retourne quelque chose ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 juillet 2019 à 14:25:17

                            getDetail n'est pas mon main, elle est appelée dans le main.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            La confiance en soi n'exclu pas le contrôle de son code.

                              4 juillet 2019 à 14:29:40

                              Ok mais ça ne répond pas à la question : tu vas faire quoi avec la valeur retournée ?

                              Est ce que tu ne peux pas le faire directement dans la fonction onsuccess par exemple ?

                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 juillet 2019 à 14:30:52

                                Salut,

                                je pense que tu peut utiliser quelque chose dans le genre :

                                async function(){
                                   let result = await tyzen.monTraitementQuiEstAsynchrone()
                                }



                                -
                                Edité par lk77 4 juillet 2019 à 14:31:06

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 juillet 2019 à 14:45:56

                                  thelinekioubeur a écrit:

                                  tu vas faire quoi avec la valeur retournée ?

                                  Je vais m en servir pour une requete AJAX

                                  Le problème Ik77 , c'est que tizen.filesystem.resolve est une fonction qui ne renvoit rien

                                  -
                                  Edité par LordKalou 4 juillet 2019 à 14:49:01

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  La confiance en soi n'exclu pas le contrôle de son code.

                                    4 juillet 2019 à 18:13:32

                                    Je te conseil de voir et comprendre les principes d'asynchrone et aussi l'utilisation de promesses et de async await
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      5 juillet 2019 à 10:53:06

                                      Je comprends tout à fait le principe des fonctions asynchrones, et je sais que c'est ça qui m'handicape. Il est vrai que j'ai du mal avec les notions de promise et async/await. Je vais essayer de me pencher plus dessus pour l'adapter à mon code. Je reposterai si je n'y arrive toujours pas :/

                                      En tout cas, merci à tous pour vos retours ! :)

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      La confiance en soi n'exclu pas le contrôle de son code.

                                        5 juillet 2019 à 11:40:20

                                        Beh oui il faut comprendre ça parce que l'asynchrone c'est à peu près le seul truc bien en javascript :-°
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          5 juillet 2019 à 14:09:54

                                          Enfait, pas besoin que la fonction ai un retour, tu peut attendre la fin de son execution :

                                          async function(){
                                             await tyzen.monTraitementQuiEstAsynchrone()
                                          
                                             // Ton traitement ici, peu importe lequel
                                             let element = document.querySelector('selector')
                                          }



                                          -
                                          Edité par lk77 5 juillet 2019 à 14:11:08

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            5 juillet 2019 à 15:21:04

                                            J 'ai beau essayer, mon problème reste toujours d'actualité :

                                            var dataToReturn = "init";//globale
                                            async function getDetail(detail){
                                            	var documentsDir;
                                            	await tizen.filesystem.resolve("documents", function (dir){
                                            			   documentsDir = dir;
                                            			   var file = documentsDir.resolve("myFile.json");
                                            			   file.openStream(
                                            					   "r", 
                                            					    function(fs) {
                                            						   var text = fs.read(file.fileSize);       
                                            						   fs.close();
                                            						   var obj  = JSON.parse(text);
                                                                 
                                            						   switch (detail){
                                            						   		case "data1Value":
                                            						   			dataToReturn = obj.data1;
                                            						   		break;
                                                                 		
                                            						   		case "data2Value":
                                            						   			dataToReturn = obj.data2;
                                            						   		break;
                                                                 		
                                            						   		case "data3Value":
                                            						   			dataToReturn = obj.data3;
                                            						   		break;
                                                                 		
                                            						   		default:
                                            						   			dataToReturn = null;
                                            						   }
                                            						   alert(dataToReturn + " dans fs");
                                            					  },  function (e) {
                                            						  	alert("Error " + e.message);
                                            					  	 }, "UTF-8");
                                                 			});
                                            
                                                 		alert(dataToReturn + " outside");//    appears ranked 1
                                                 		
                                                  return dataToReturn;
                                            }


                                            Si je fais un alert(getDetail("data1Value")), j obtiens dans l'ordre :

                                            - [object Promise]

                                            -init outside

                                            - data1Value dans fs

                                            Ai-je oublié quelque chose à votre avis ? :( 

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            La confiance en soi n'exclu pas le contrôle de son code.

                                              6 juillet 2019 à 0:40:37

                                              Bonsoir.

                                              Je te conseillerai plutôt d'utiliser console pour tes debug au lieu de  faire des alert.

                                              Ou encore mieux, utiliser l'instruction debugger, ça te permettra de faire des breakpoint dans ton script et donc de suivre son déroulement.

                                              -
                                              Edité par Lartak 6 juillet 2019 à 0:45:09

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                                                6 juillet 2019 à 11:25:35

                                                Salut,

                                                j'ai fait un jsfiddle pour tester ton problème :

                                                https://jsfiddle.net/lk77/15h8jbn3/18/

                                                pour moi ça affiche : 

                                                init outside
                                                
                                                abc dans fs
                                                
                                                abcd dans fs
                                                
                                                abcde dans fs

                                                et tu voudrais que l'ordre soit inversé ?

                                                Si je retourne une promise dans tizen.filesystem.resolve, ça fonctionne :

                                                abc dans fs
                                                abc outside
                                                
                                                abcd dans fs
                                                abcd outside
                                                
                                                abcde dans fs
                                                abcde outside

                                                 https://jsfiddle.net/lk77/15h8jbn3/26/

                                                ce qui veut dire que ta fonction tizen.filesystem.resolve ne renvoie pas de promise, donc c'est à toi de renvoyer une promise dans ta fonction et de la resolve quand la callback que tu as passé en paramètre à la fonction resolve de tizen.filesystem est appelée.

                                                La version finale en utilisant une promise et then() :

                                                https://jsfiddle.net/lk77/15h8jbn3/44/

                                                -
                                                Edité par lk77 6 juillet 2019 à 11:51:36

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  8 juillet 2019 à 12:07:44

                                                  Merci beaucoup lk77 , c'est exactement ça dont j'avais besoin ! Mais il me reste une question : Cette fonction me renvoie un objet type Promise. Si je veux récupérer la valeur affichée (abc par exemple) dans une variable (pour un traitement en dehors de la fonction), je fais comment ?

                                                  -
                                                  Edité par LordKalou 8 juillet 2019 à 12:08:25

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  La confiance en soi n'exclu pas le contrôle de son code.

                                                    8 juillet 2019 à 13:31:01

                                                    Tu utilise la fonction then :

                                                    getDetail("data3Value").then(dataToReturn => {
                                                    
                                                    	console.log(dataToReturn + ' outside')
                                                    
                                                    })

                                                    ou tu peut utiliser await si tu te trouve dans une fonction asynchrone :

                                                    let boot = async function () {
                                                    	let data = await getDetail("data3Value")
                                                    	console.log(data + ' outside - async')
                                                    }
                                                    boot()




                                                    -
                                                    Edité par lk77 8 juillet 2019 à 13:34:46

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      8 juillet 2019 à 14:19:10

                                                      Merci infiniement, tu me sors une belle épine du pied là :D , topic résolu !
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      La confiance en soi n'exclu pas le contrôle de son code.

                                                      ordre d’exécution code javascript

                                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                      • Editeur
                                                      • Markdown