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 :

Portée des variables dans une requête


Sujet :

JavaScript

  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 48
    Par défaut Portée des variables dans une requête
    Bonsoir,

    J'ai un soucis au niveau de la portée d'une variable dans une requête au niveau de mon callback. Est-ce que quelqu'un pourrait jeter un oeil ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    static getData(url, callback) {
            let rep;
            const xhr = new XMLHttpRequest();
            xhr.open('GET', url, true); // 
            xhr.send(null);
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    callback(rep = JSON.parse(xhr.responseText));
                }
                else {
                    console.log('chargement...');
                }
            }
        }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ajax.getData(url,  () => { map.createMarker() });
    La classe Map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    createMarker() {
            for (var info of rep) { ..... // ReferenceError: rep is not defined

  2. #2
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour,
    "rep" est local à la fonction.
    Il faudrait le définir en dehors ou le passer en paramètre 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
    static getData(url, callback) {
    		const xhr = new XMLHttpRequest();
    		xhr.open('GET', url, true);
    		xhr.send(null);
    		xhr.onreadystatechange = function () {
    			if (this.readyState === 4) {
    				callback(JSON.parse(this.responseText));
    			}
    			else {
    				console.log('chargement...');
    			}
    		}
    	}
     
    Ajax.getData(url,  (rep) => { map.createMarker(rep); });
    Remarques :
    - J'en ai profité pour remplacer "xhr" par "this" dans la fonction "onreadystatechange".
    - Pour la fonction "callback", il y aurait des variantes possibles permettant d'avoir "map" pour valeur de "this" dans la fonction "createMarker" en utilisant call, apply ou bind.
    - for (var info of rep) pourrait ne pas fonctionner selon ce que vaut "rep" :
    Si rep=[{a:1},{b:2}], cela fonctionnera, mais pas si rep={a:1}, voir ici.

  3. #3
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 098
    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 098
    Par défaut
    Citation Envoyé par Loralina Voir le message
    - J'en ai profité pour remplacer "xhr" par "this" dans la fonction "onreadystatechange".
    Petite réflexion méta. Le this de JS est capricieux, il change selon la façon dont on invoque la fonction, et on peut même le changer explicitement avec call, apply ou bind comme tu l’as si justement fait remarquer.
    Pour ces raisons, certains développeurs et certaines développeuses font le choix de ne jamais utiliser this en JS. Je sais que ça part d’une bonne intention, mais réintroduire des this dans un code qui n’en a pas, ce n’est pas une amélioration, c’est une surcorrection. Dans le doute, il eût été préférable de s’en tenir au style choisi par LO88ra.

    - for (var info of rep) pourrait ne pas fonctionner selon ce que vaut "rep" :
    Si rep=[{a:1},{b:2}], cela fonctionnera, mais pas si rep={a:1}
    Et pourquoi pas rep = [{a:1}] ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour,
    Je ne suis pas de cet avis pour this.
    Citation Envoyé par Watilin Voir le message
    Dans le doute, il eût été préférable de s’en tenir au style choisi par LO88ra.
    C'est relativement acceptable dans la mesure où elle utilise une constante.
    Mais dans le cas d'une variable, il est mieux de ne pas dépendre d'une variable externe qui peut avoir été modifiée dans la suite du code et pointer sur tout autre chose, éventuellement un autre XMLHttpRequest.
    Après, il ne s'agirait pas de coder différemment selon qu'on utilise une variable ou une constante.
    Autant utiliser event.target si on ne veut pas utiliser this.

    Citation Envoyé par Watilin Voir le message
    Et pourquoi pas rep = [{a:1}] ?
    Si rep=[{a:1}], donc un Array, la boucle for of passera (à la différence de si rep={a:1}).
    Oui et alors ?
    J'attire simplement son attention sur le fait qu'il pourra y avoir un problème avec sa boucle en l'état selon le json.

Discussions similaires

  1. [XL-2016] Problème portée variable globale
    Par ershisan dans le forum Excel
    Réponses: 4
    Dernier message: 17/03/2016, 10h10
  2. Problème portée des variables
    Par thanks33 dans le forum Débuter
    Réponses: 4
    Dernier message: 15/06/2009, 09h17
  3. Problème contructeur portée variable
    Par mihaestii dans le forum Langage
    Réponses: 4
    Dernier message: 22/08/2007, 16h49
  4. [Débutant] Problème de variables
    Par bonnefr dans le forum SWT/JFace
    Réponses: 9
    Dernier message: 12/05/2004, 17h41
  5. [servlet]problème de variable jamais nulle
    Par omega dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/03/2004, 09h31

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