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 :

Compréhension de code


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Par défaut Compréhension de code
    Bonjour !

    Je débute en développement et je cherche à comprendre le code ci-dessous, si quelqu’un peut me l’expliquer en détail je vous en serrais grandement reconnaissant par exemple qu’est ce que : (verb, url) dans "req.open(verb, url);".

    Je pense avoir compris que l’on créer une fonction que l’on appel "Request" et qu’elle est appeler par le second morceau de code ce qui fait apparaître des marqueurs sur une carte, je sais aussi que l'on récupère les données d'un API, mais j’aimerai de plus amples détails.

    Merci d’avance.

    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
    function Request(verb, url) {
     
        this.verb = verb;
        this.url = url;
     
        var stations = [];
     
        this.call = function(callback) {
            var req = new XMLHttpRequest();
            req.open(verb, url);
     
            req.addEventListener('load', function() {
                if (req.status >= 200 && req.status < 400) {
                    stations = JSON.parse(req.responseText);
                    callback(req.responseText);
                } else {
                    callback(req.status);
                }
            });
     
            req.addEventListener('error', function() {
                console.log("erreur avec l'url " + url);
            });
     
            req.send(null);
        };
     
        this.form = function(callback) {
            callback(stations);
        };
     
    }
    var requestApiJcDecaux = new Request("GET", "https://api.jcdecaux.com/vls/v1/stations?contract=Toulouse&apiKey=xxxxxxxxxxxxxxxxxxxxxxxxxx");
     
    requestApiJcDecaux.call(function (response) {
     
        response = JSON.parse(response);
        response.forEach(function (info) {
            var latitude = info.position.lat;
            var longitude = info.position.lng;
            L.marker([latitude, longitude]).on('click', onMarkerClick).addTo(map);
        });
     
        function onMarkerClick(e) {
            var addressElt = document.getElementById("address");
            var bikeStandsElt = document.getElementById("bikeStands");
            var availableBikesElt = document.getElementById("availableBikes");
            requestApiJcDecaux.form(function (infos) {
                infos.forEach(function (info) {
                    if ((e.latlng.lat === info.position.lat) && (e.latlng.lng === info.position.lng)) {
                        addressElt.innerText = info.address;
                        bikeStandsElt.innerText = info.bike_stands;
                        availableBikesElt.innerText = info.available_bikes;
                        return;
                    }
                });
            });
        }
    });

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Salut,
    le verbe HTTP, plus couramment appelé méthode, est un mot-clé, généralement GET ou POST, qui indique grosso modo l’action que le serveur est censé faire.
    • GET signifie « envoie-moi des données »
    • POST signifie « enregistre des trucs » (souvent dans une base de données)
    • HEAD signifie « envoie-moi juste les en-têtes du fichier »
    • PUT signifie « je t’envoie un fichier »
    • etc.

    La principale différence entre GET et POST est la façon dont sont envoyés les paramètres de requête : avec GET, ils sont dans l’URL ; avec POST, ils sont dans le corps de la requête.

    La documentation : https://developer.mozilla.org/fr/doc...P/M%C3%A9thode
    Voir aussi https://fr.wikipedia.org/wiki/Hypert...#M%C3%A9thodes

    Concernant le code que tu as donné, il y a une subtilité que tu pourrais ne pas comprendre entièrement tout de suite, si tu as l’habitude des autres langages orientés objet : c’est le fait que Request est un constructeur.
    L’objet requestApiJcDecaux est construit avec new Request( ... ) et reçoit, au sein du constructeur, des propriétés (this.verb, this.url, this.call et this.form).

    L’élément important dans ce bout de code est la fonction call qui fait une requête ajax. Cela consiste, en gros, en quatre étapes :
    1. créer un objet XMLHttpRequest
    2. ouvrir une connexion avec req.open
    3. attacher des fonctions (addEventListener) pour gérer la réponse du serveur ('load' en cas de succès, 'error' en cas d’échec)
    4. lancer la requête.


    Un code JS repose souvent sur l’utilisation des fonctions de rappel (en anglais callback), c’est-à-dire des fonctions qu’on déclare mais qu’on n’appelle pas nous-mêmes ; c’est l’objet ajax (req) qui se charge de les appeler au moment adéquat.
    C’est une notion importante, aussi je te conseille de prendre le temps de bien la comprendre, avec des tutos, avant de te lancer dans un projet complexe.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Par défaut
    Merci beaucoup pour ta réponse, je vais regarder cela de plus prêt.
    Mais cela veut dire que les "paramètres" qui sont entre parenthèses peuvent êtres nommés comme bon nous semble ? J’ai fait le test en remplaçant verb et le code fonctionner quand même.

    Peut on simplifié ce code ? J’ai essayer et je me retrouve avec cela :

    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
    function Requete() {
     
     
        call = function(callback) {
            let req = new XMLHttpRequest();
            req.open('GET', 'https://api.jcdecaux.com/vls/v1/stations?contract=Toulouse&apiKey=xxxxxxxxxxxxxxxxxxxxxxxxx');
     
            req.addEventListener('load', function() {
                if (req.status >= 200 && req.status < 400) {
                    stations = JSON.parse(req.responseText);
                    callback(req.responseText);
                } else {
                    callback(req.status);
                }
            });
     
            req.addEventListener('error', function() {
                console.log("erreur avec l'url " + url);
            });
     
            req.send(null);
        };
     
    }
     
    let requestApi = new Requete("GET", "https://api.jcdecaux.com/vls/v1/stations?contract=Toulouse&apiKey=xxxxxxxxxxxxxxxxxxxxxxxxx");
     
    call (function (response) {
     
        response = JSON.parse(response);
        response.forEach(function (info) {
            L.marker([info.position.lat, info.position.lng]).addTo(mymap).bindPopup("Je suis un Texte.");
        });
    });
    Mais je pense qu’il y a encore plus simple mais je ne trouve pas. Et mon code est il correct ou pas ??

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Citation Envoyé par Hoobux Voir le message
    Mais cela veut dire que les "paramètres" qui sont entre parenthèses peuvent êtres nommés comme bon nous semble ?
    Oui, tant que tu n’oublies aucun endroit où le nom apparaît durant le renommage, et tant que ça ne crée pas de conflit de noms, c’est-à-dire quand deux variables se retrouvent avec le même nom ; on appelle ça aussi une collision.

    Peut on simplifié ce code ?
    Oui. Le code qui t’a été donné peut se décomposer en deux parties :
    • la partie qui déclare Request, et qui est la partie réutilisable ;
    • la partie qui crée l’objet requestApiJcDecaux, puis qui l’utilise. C’est la partie situationnelle, non réutilisable.


    Écrire du code réutilisable permet de réduire le temps de développement et de faciliter la maintenance du code. Mais sur le plan purement théorique, ce n’est pas utile, et quand on débute, on peut sauter cette étape. Avec l’expérience tu comprendras son utilité par toi-même.

    Et mon code est il correct ou pas ??
    Il y a deux petits problèmes, qui sont tous deux liés à des particularités de JavaScript qui ne sont pas intuitives.

    Le premier problème, c’est la façon dont tu déclares call à l’intérieur de la fonction Requete. Quand tu utilises pour la première fois un nom de variable, sans utiliser ni var ni let, JavaScript suppose que ton intention est de faire une variable globale. Cette situation peut mener à des problèmes de collision inattendus, du coup on préfère éviter.
    (Idem pour stations plus bas.)

    C’est un problème tellement courant qu’un mode optionnel a été conçu (entre autres) pour le détecter et empêcher que ça arrive : le mode strict. Pour moi, le mode strict est indispensable, et je pense que c’est un très bon réflexe à adopter quand on débute, aussi on va ajouter une petite ligne au début de ton code :
    Ça va passer tout ton script en mode strict, et les variables non déclarées seront signalées par un message d’erreur, que tu pourras voir dans la console.
    Au fait, si tu ne connais pas la console, c’est un autre outil indispensable pour développer en JS. Tous les navigateurs en ont une, appuie simplement sur F12 et choisis l’onglet « console ».

    le second problème, c’est cette variable url dans l’instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log("erreur avec l'url " + url);
    Puisque que tu as supprimé l’argument url de la fonction Requete, cette variable ne correspond plus à rien et, si un problème de connexion survient (évènement 'error'), ton script lèvera une erreur. Le plus simple serait de la remplacer par l’url « en dur » que tu as utilisée au-dessus, 'https://api.jcdecaux.com/...'. Mais vu qu’il ne s’agit que d’afficher un message dans la console, ce n’est pas très important.

    À noter qu’ici, le message devrait être adressé à l’utilisateur final, vu qu’il s’agit d’un problème de connexion et qu’il peut probablement y faire quelque chose (vérifier son wifi ou autre). L’utilisateur n’est pas censé se servir de la console, aussi il faudrait trouver un autre moyen de lui indiquer le problème, idéalement en injectant du HTML dans la page. Mais c’est un détail.

    J’attire ton attention sur un autre petit truc, qui n’est pas un problème en JS mais qui pourrait en être un dans un autre langage, par exemple Java ou C. Je te le dis pour que tu ne sois pas surpris le jour où tu décides d’apprendre un autre langage.
    Il s’agit du nombre d’arguments d’une fonction.
    Je m’explique : en supprimant les arguments de la fonction Requete, tu as modifié ce qu’on appelle sa signature. La signature n’est pas importante en JS car on peut appeler une fonction avec autant de paramètres qu’on veut : autant, moins, ou plus que ce qui est attendu. Par exemple si tu as la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function f(a, b) {
      return a + 2*b;
    }
    Tu peux l’appeler de ces façons :
    • f(2, 3)
    • f(2, 3, 1)
    • f(2)

    Le troisième exemple renverra un résultat bizarre, mais aucune erreur ne sera levée.

    Une petite note sur la terminologie. En théorie, on est censé parler d’« argument » dans la déclaration de la fonction, autrement dit dans sa signature ; et « paramètre » au moment d’appeler la fonction, quand on lui passe des valeurs. Dans la pratique, la plupart des gens utilisent l’un ou l’autre des ces termes sans faire la distinction.

    Dans ton code simplifié, tu passes toujours des paramètres à new Requete, mais tu les passes dans le vent car ils n’ont plus d’arguments correspondants dans la signature.

    Je vois que tu utilises let. C’est une bonne chose, et je pense que pour débuter il ne faut pas trop se soucier de var. Les différences entre les deux sont subtiles, et il n’est pas urgent de les connaître. Les choses se passent très bien quand on utilise uniquement let.
    Je t’invite à consulter l’article du MDN sur let pour te familiariser avec le concept de portée des variables en JavaScript.

    J’ai essayer et je me retrouve avec cela :
    […]
    Mais je pense qu’il y a encore plus simple mais je ne trouve pas.
    On peut simplifier encore plus en se débarassant de la partie réutilisable, à savoir Requete. On peut même extraire le contenu de la fonction call. Du coup, il faut déplacer la fonction qu’on lui passait en paramètre (callback). Pour faire ça j’ai créé une nouvelle fonction que j’ai appelée ma_callback. Voilà ce que ça donne :

    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
    "use strict";
     
    function ma_callback(response) {
      response = JSON.parse(response);
      response.forEach(function (info) {
        L.marker([info.position.lat, info.position.lng]).addTo(mymap).bindPopup("Je suis un Texte.");
      });
    });
     
    let req = new XMLHttpRequest();
    req.open('GET', 'https://api.jcdecaux.com/vls/v1/stations?contract=Toulouse&apiKey=xxxxxxxxxxxxxxxxxxxxxxxxx');
     
    req.addEventListener('load', function() {
      if (req.status >= 200 && req.status < 400) {
        let stations = JSON.parse(req.responseText);
        ma_callback(req.responseText);
      } else {
        ma_callback(req.status);
      }
    });
     
    req.addEventListener('error', function() {
      console.log("erreur de connexion");
    });
     
    req.send(null);
    Note, je ne sais pas comment sont déclarées les variables L et mymap que ton script utilise. Si tu dois copier ton bout code au milieu d’un autre script, assure-toi que l’instruction "use strict"; se trouve bien au début du fichier, sinon elle ne marchera pas. (Il y a bien une technique pour contourner cette contrainte, mais je ne veux pas t’embrouiller avec encore plus de détails pour l’instant.)
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Par défaut
    Merci beaucoup Watilin pour ton aide, c'est encore flou pour moi mais je ne peux que progresser

    Je souhaite rajouter des fonctions pour ma carte interactive, par exemple je veux rajouter une fonction qui lors du clic sur un marqueur permets d'afficher certains éléments voici mon code :

    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
     
    function ma_callback(response) {
      response = JSON.parse(response);
      response.forEach(function (info) {
        L.marker([info.position.lat, info.position.lng]).on('click', onMarkerClick).addTo(mymap).bindPopup(info.name);
      });
    };
     
    function onMarkerClick(e) {
            let address = document.getElementById("adresse-station");
            let bikeStands = document.getElementById("place-libre");
            let availableBikes = document.getElementById("velo-dispo");
            let statusStation = document.getElementById("etat-station");
            ma_callback (function (infos) {
                infos.forEach(function (info) {
                    if ((e.latlng.lat === info.position.lat) && (e.latlng.lng === info.position.lng)) {
                        address.innerText = info.address;
                        bikeStands.innerText = info.bike_stands;
                        availableBikes.innerText = info.available_bikes;
                        statusStation.innerText = info.status
                        return;
                    }
                });
            });
        }
    Au vue du résultat je me suis tromper, je pense que je n'arrive pas à appeler ma requête ajax afin de récupérer les informations et les affichés...

    Ne serais t'il pas plus simple de mettre ma requête ajax au sein du fonction ?? (question bête peut être ) merci d'avance.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    e souhaite rajouter des fonctions pour ma carte interactive
    il serait surement plus judicieux de poser ta question dans une nouvelle discussion dans le forum Bibliothèques & Frameworks sous le préfixe [LeafLet], tu devrais même y trouver une réponse à ta question

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Par défaut
    C'est fait NoSmoking merci à toi

    Cependant je pense que mon problème vient surtout de la compréhension de JavaScript après plusieurs cours et tutos c'est toujours flou.

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    la compréhension de JavaScript (...) c'est toujours flou
    Ce n'est pas un soucis car comme le dit le proverbe « le rhum(*) ne c'est pas fait en un jour ».

    (*)je ne suis pas sûr de ce mot

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

Discussions similaires

  1. compréhension de code en asp
    Par bidule123456 dans le forum ASP
    Réponses: 1
    Dernier message: 21/08/2007, 11h12
  2. compréhension de code (passage à une autre page)
    Par kokokaine dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/05/2007, 11h02
  3. Réponses: 3
    Dernier message: 12/01/2007, 09h42
  4. [VB-Access]recset! Pb de compréhension de code
    Par sk8bcn dans le forum VBA Access
    Réponses: 5
    Dernier message: 15/12/2006, 15h26
  5. Compréhension du code
    Par Ivanelis dans le forum Assembleur
    Réponses: 3
    Dernier message: 12/06/2006, 12h08

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