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 :

Récupération de données avec Requête fetch


Sujet :

JavaScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mars 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Récupération de données avec Requête fetch
    Bonjour, je dois récupérer des données de produits qui ne se trouve pas dans le LS (par exemple le prix) pour que si un jour sont prix venez a changer, il ne soit pas afficher avec le prix précédent dans le panier. Je dois donc récupérer par une requête fetch ses données souhaité, hors je n'arrive pas a les intégrer dans ma page. Actuellement j'ai bien les données de mes produits présent dans le panier d'afficher ma console. Mais impossible d'en extraire le données. 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    //Récuperation des produits dans le panier
    let productLocalStorage = JSON.parse(localStorage.getItem("Product"));
     
     
     
    //Intégration HTML + des données produit sur la page
    const parser = new DOMParser();
    let productSection = document.getElementById("cart__items");
    for (i = 0; i < productLocalStorage.length; i++) {
      let produitEnCours = fetch("http://localhost:3000/api/products/" + productLocalStorage[i].Id)
        .then((res) => { return res.json();})
        .then((data) => console.table(data));
     
      let productItem = `
        <article class="cart__item" data-id="${productLocalStorage[i].Id}" data-color="${productLocalStorage[i].Color}">
            <div class="cart__item__img">
                <img src="${produitEnCours.imageUrl}" loading="lazy" alt="${produitEnCours.altTxt}">
            </div>
            <div class="cart__item__content">
                <div class="cart__item__content__description">
                <h2>${produitEnCours.name}</h2>
                <p>${productLocalStorage[i].Color}</p>
                <p>${produitEnCours.price} €</p>
                </div>
                <div class="cart__item__content__settings">
                    <div class="cart__item__content__settings__quantity">
                        <p>Qté : </p>
                        <input type="number" class="itemQuantity" name="itemQuantity" min="1" max="100" value="${productLocalStorage[i].Qty}">
                    </div>
                    <div class="cart__item__content__settings__delete">
                        <p class="deleteItem">Supprimer</p>
                    </div>
                </div>
            </div>
        </article>`;
        const htmlString = parser.parseFromString(productItem,"text/html");
            productSection.appendChild(htmlString.body.firstChild);
    }

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    je n'ai pas compris à quel endroit dans votre code vous n'avez pas les données que vous cherchez.

    et si vous contactez le serveur à chaque affichage, le cache côté navigateur ne va pas aider. donc il ne serait pas plus simple de ne pas utiliser le cache et d'afficher directement les données qui viennent du serveur ?

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    Mais impossible d'en extraire le données.
    fetch() est asynchrone et va donc te retourner une « promesse » ce que tu ne veux pas, tu veux le résultat.

    Le résultat est donc disponible dans ton 2éme then
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let produitEnCours = fetch("http://localhost:3000/api/products/" + productLocalStorage[i].Id)
      .then((res) => {
        return res.json();
      })
      .then((data) => {
        // le résultat est disponible ICI, c'est data
        console.table(data);
      });
    tu ne peux donc pas affecter ce résultat à ta variable produitEnCours, il te faut traiter celui-ci dans le then, ou dans une fonction de rappel (callback).

    Pour faire ce que tu souhaites il te faudrait utiliser le couple de mots clé async/await, pour attendre le résultat de fetch() donc englober ton code dans une fonction.

    Exemple que j'ai sous la main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    async function getAwaitDatas(villes) {
      const result = [];
      for (let i = 0; i < villes.length; i += 1) {
        const url = urlSearch.replace("<ville>", villes[i]);
        data = await fetch(url)
          .then((response) => response.json());
     
        // les données sont disponibles
        elemDestAwait.insertAdjacentHTML("beforeend", template(data[0]));
      }
    }
    dans ce cas les requêtes attendent que la précédente soit résolue pour être exécutée, cela sera plus long, le script est bloqué.

    Son équivalent en asynchrone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function getAsyncDatas(villes) {
      for (let i = 0; i < villes.length; i += 1) {
        const url = urlSearch.replace("<ville>", villes[i]);
        fetch(url)
          .then((response) => response.json())
          .then((data) => {
            elemDestAsync.insertAdjacentHTML("beforeend", template(data[0]));
          });
      }
    }
    dans ce cas les résultats peuvent arriver dans le désordre, mais c'est plus rapide.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2010, 09h37
  2. [MySQL] Création de variables dans une boucle et récupération de données avec une requête
    Par lavande4 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/09/2008, 11h10
  3. [D6 => XML] Récupération de données avec une boucle.
    Par Bason_sensei dans le forum Delphi
    Réponses: 1
    Dernier message: 23/05/2006, 13h50
  4. [MySQL] Problème récupération de données avec un SELECT DISTINCT
    Par 12_darte_12 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2005, 14h48
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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