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

AJAX Discussion :

Variable résultat de Fetch reste undefined malgré await/async


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut Variable résultat de Fetch reste undefined malgré await/async
    Bonjour à tous,

    Je n'arrive pas à ce que la variable colDepenses qui est un tableau préparé pour chart.js soit enregistrée suite à mon fetch pour être disponible dans le reste du code, elle reste "undefined".
    J'ai pourtant utilisé la méthode async/await et je vois bien le bon tableau de valeurs si je mets un console.log dans le fetch, mais dès que je sollicite la variable ailleurs dans le code elle devient undefined !

    Que fais-je mal ?

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    const filtreAnneeDepenses = (selectionAnnee) => {
    let formData = new FormData();
    formData.append("selectionAnnee", selectionAnnee);
     
    for (let item of formData) {
    console.log(item[0], item[1]);
    }
    let colDepenses
    async function statsDepenses() {
    let response = await fetch("/admin/statistiques", {
    body: formData,
    method: "POST",
    cache: "no-cache",
    headers: {
    "X-Requested-With": "XMLHttpRequest"
    }
    })
    let colDepenses = await response.json();
    return colDepenses
    };
    statsDepenses()
    }
     
    // Obtenir dernier mois contenu dans le select et afficher les dépenses au démarrage de la page
    if (selectAnneesDepenses.value) {
    let selectionAnnee = selectAnneesDepenses[0].value;
    selectAnneesDepenses.value = selectionAnnee;
    filtreAnneeDepenses(selectionAnnee);
     
    }
     
    selectAnneesDepenses.addEventListener("change", (e) => {
    let selectionAnnee = e.target.value;
    filtreAnneeDepenses(selectionAnnee);
    });
    // Graphique dépenses
    const afficherGraphique = (colDepenses) => {
     
    let graph = new Chart(graphDepenses, {
    type: "line",
    data: {
    labels: [
    "Janv",
    "Févr",
    "Mars",
    "Avr",
    "Mai",
    "Juin",
    "Juil",
    "Août",
    "Sept",
    "Oct",
    "Nov",
    "Déc",
    ],
    datasets: [
    {
    label: "Dépenses pour l'année",
    data: colDepenses,
    backgroundColor: [
    "red",
    "blue",
    "green",
    "red",
    "blue",
    "green",
    "red",
    "blue",
    "green",
    "red",
    "blue",
    "green",
    ],
    borderWidth: 1
    },
    ]
    }
    })
    };
    afficherGraphique()
    	</script>

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut
    Bon, j'ai réussi à faire fonctionner le bazar

    J'ai repris un fetch classique avec appel à fonction interne.

    Il fallait faire un JSON.parse sur le tableau de data.
    J'ai aussi mis en place un destroy() sur le graphique à chaque instance car cela bloquait ... Merci pour votre aide

    Je partage ici le code pour qui en aurait besoin :

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    const selectAnneesDepenses = document.querySelector(".selectAnneesDepenses");
    const graphDepenses = document.querySelector("#graphDepenses");
     
    const filtreAnneeDepenses = (selectionAnnee) => {
      let formData = new FormData();
      formData.append("selectionAnnee", selectionAnnee);
     
      for (let item of formData) {
        console.log(item[0], item[1]);
      }
     
      let colDepenses;
      fetch("/admin/graphique-depenses", {
        body: formData,
        method: "POST",
        cache: "no-cache",
        headers: {
          "X-Requested-With": "XMLHttpRequest",
        },
      })
        .then((response) => response.json())
        .then((data) => {
          colDepenses = JSON.parse(data);       
          afficherGraph()     
        });
        const afficherGraph=()=>{
          let graph=Chart.getChart('graphDepenses')
          if(graph) graph.destroy()
          graph = new Chart(graphDepenses, {
            type: "bar",
            // options:{indexAxis:'y'},
            data: {
              labels: [
                "Janv",
                "Févr",
                "Mars",
                "Avr",
                "Mai",
                "Juin",
                "Juil",
                "Août",
                "Sept",
                "Oct",
                "Nov",
                "Déc",
              ],
              datasets: [
                {
                  label: "Dépenses pour l'année",
                  data: colDepenses,
                  backgroundColor: [
                    "red",
                    "blue",
                    "green",
                    "red",
                    "blue",
                    "green",
                    "red",
                    "blue",
                    "green",
                    "red",
                    "blue",
                    "green",
                  ],
                  borderWidth: 1,
                },
              ],
            },
          });
        }
    };
     
    //Obtenir liste des dépenses après sélection de l'année
    selectAnneesDepenses.addEventListener("change", (e) => {
      let selectionAnnee = e.target.value;
      filtreAnneeDepenses(selectionAnnee);
    });
    // Obtenir dernier mois contenu dans le select et afficher les dépenses au démarrage de la page
    if (selectAnneesDepenses.value) {
      let selectionAnnee = selectAnneesDepenses[0].value;
      selectAnneesDepenses.value = selectionAnnee;
      filtreAnneeDepenses(selectionAnnee);
    }

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

Discussions similaires

  1. Variable "undefined" malgré déclaration globale
    Par clickandgo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/12/2022, 00h09
  2. Réponses: 2
    Dernier message: 18/07/2017, 17h03
  3. [XL-2007] Copier une variable résultat vers une cellule d'une colonne adjacente.
    Par Donq64 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/02/2015, 20h35
  4. [MySQL] variable résultat de la requête non renseignée
    Par Invité dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 14/09/2011, 05h02
  5. Réponses: 2
    Dernier message: 30/03/2011, 15h45

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