Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1788 connectés 

  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  Boucle for pour récupération tableau API [Résolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Boucle for pour récupération tableau API [Résolu]

n°2420360
Profil sup​primé
Posté le 22-06-2022 à 18:05:19  answer
 

Bonjour,
 
Voilà, après maintes réflexions, moults tests, et myriades de recherches, je serre.
 
Je suis actuellement en formation Javascript avec Openclassrooms. Le problème est que je dois récupérer en format JSON des datas avec une requête HTTP, ce grâce à fetch(). Jusque ici, à moins que je me plante quelque part, pas de problème. Ensuite je veux donc gentiment faire intervenir ma boucle for pour aller choper les données des éléments du tableau afin de les incorporer dans le DOM, mais là que ça bugue. Aucun effet de la boucle lorsque je teste, sur la console j'ai l'apparition undefined. Donc je requiers de l'aide. Je précise que je ne désire pas avoir la solution du problème, simplement une indication de ce qui peut clocher dans ma logique ou dans ma syntaxe.  
 
Voici mon code :
 
const url = ' http://localhost:3000/...'
 
const products = fetch(url)
  .then(function(resolve) {
    if (resolve.ok) {
      return resolve.json();
    }
  })
  .catch(function(error) {
    alert = 'HTTP Error ' + error.status
  });
 
for (let i in products){
        let prod = products[i]
} console.log(prod)
 
N.B. : le console.log, portée des variables ou non, si je le mets à l'intérieur de la boucle, même résultat, avec fonction, le même problème.


Message édité par Profil supprimé le 13-08-2022 à 16:48:25
mood
Publicité
Posté le 22-06-2022 à 18:05:19  profilanswer
 

n°2420361
Devil'sTig​er
Posté le 22-06-2022 à 18:09:52  profilanswer
 

Parce que tu n'a pas compris comment le await/async pattern marche.
 
A la ligne "for let i in product" tu n'as pas encore recu la reponse que tu demandes a la ligne "if resolve ok" en gros.
 
Donc retour a la case départ, il faut que tu comprennes le systeme de callback et le pattern async/await qui en découle quasi directement.

n°2420364
Profil sup​primé
Posté le 22-06-2022 à 18:18:07  answer
 

Ah ouais c'était marqué dans les cours. Ça marche, merci.

n°2420476
Profil sup​primé
Posté le 23-06-2022 à 19:43:31  answer
 

J'ai fait ça, mais je ne pense pas que ce soit efficient, toujours le même console.log undefined, et rien qui ne se modifie sur le DOM.
 
const url = 'http://localhost:3000/...'
 
const products = fetch(url)
  .then(function (resolve){
      return resolve.json()
  }).then(function(data){
      return data = []
  }).catch(function(error){
    alert = 'HTTP Error ' + error.status
  })
 
async function productsArray(product){
  for (let i in products) {
    product = products[i]
    let newElement = document.querySelector('#items')
    newElement.appendChild(product)
  }
}
 
async function resultProduct(resultProduct){
  await products
  await productsArray()
  return resultProduct
}
 
 
Encore une fois, je ne veux pas une réponse entière, mais juste des indications de mon erreur.

n°2420477
Profil sup​primé
Posté le 23-06-2022 à 19:50:01  answer
 

const url = 'http://localhost:3000/api/products'
 
const products = fetch(url)
  .then(function (resolve){
      return resolve.json()
  }).then(function(data){
      return data
  }).catch(function(error){
    alert = 'HTTP Error ' + error.status
  })
 
async function productsArray(product){
  for (let i in products) {
    product = products[i]
    let newElement = document.querySelector('#items')
    newElement.appendChild(product)
  }
}
 
async function resultProduct(resultProduct){
  await products
  await productsArray()
  return resultProduct
}
 
 
 
N.B. : le code est comme ça, pas le data = [], juste data. Un truc que j'avais testé

n°2420479
Profil sup​primé
Posté le 23-06-2022 à 20:05:02  answer
 

const url = 'http://localhost:3000/...'
 
const products = fetch(url)
  .then(function (resolve){
      return resolve.json()
  }).then(function(data){
      return data
  }).catch(function(error){
    alert = 'HTTP Error ' + error.status
  })
 
async function productsArray(product){
  await products
  for (let i in products) {
    product = products[i]
     
  }
}productsArray()
 
Ceci qui me semble peut-être plus juste. Mais bref, je vais pas inonder la page de code, j'attends que quelqu'un ait une indication ou pas.


Message édité par Profil supprimé le 23-06-2022 à 20:05:44
n°2420481
Devil'sTig​er
Posté le 23-06-2022 à 21:58:32  profilanswer
 

Code :
  1. async maSuperFonction() {
  2.     const products = await fetch...
  3.     for (let i in products) {
  4.         ...
  5.     }
  6. }


 
Tout simplement ;)

n°2420482
Profil sup​primé
Posté le 23-06-2022 à 22:04:24  answer
 

Je note, et vois ça. C'est vrai que c'est bien plus clair et moins prise de tête. Je me serais bien planté. Seul, je sais même pas si j'eus pu trouver un jour, ce qui m'énerve. Merci en tout cas.

n°2420565
Profil sup​primé
Posté le 24-06-2022 à 18:17:10  answer
 

Bon. J'ai essayé, essayé, encore, encore, ça ne fonctionne pas de quelconque manière. Mon fichier JS est bien lié à mon HTML, j'ai testé avec un innerHTML, nickel. Cependant, quand dans la console je teste mon code de récupération de données sur la page web de l'API, aucun problème (j'utilise Visual Studio Code et node server), mais si dans la console je teste le code depuis la page web de mon fichier HTML, ça me dit url introuvable. Je pense, peut-être à tort, mais que le problème vient de là.

n°2420566
Profil sup​primé
Posté le 24-06-2022 à 19:33:55  answer
 

Voilà ce que j'ai fait. Je préfère séparer mes fonctions, donc une pour la requête API, une pour les données ensuite recueillies que je gère avec ma boucle for. Aucun résultat attendu.  
 
const url = 'http://localhost:3000/...'
 
const requestApi = fetch(url)
  .then(function(resolve) {
      return resolve.json()
  }).then(function(data) {
      return data
  }).catch(function(error) {
    alert = 'HTTP Error ' + error.status
  })
 
async function productsArray(){
  await requestApi
  for (let product in requestApi) {
    let sofa = requestApi[product]
    let element = document.querySelector('#items')
    let newProduct = document.createElement('div').appendChild(sofa)
    element.appendChild(newProduct)
  }
}
 
productsArray()

mood
Publicité
Posté le 24-06-2022 à 19:33:55  profilanswer
 

n°2420974
reroll
Posté le 30-06-2022 à 19:49:46  profilanswer
 

Devil'sTiger t'as dit de passer par des async await mais il aurait du préciser de ne pas mélanger avec  les promesses (.then().catch()). Du coup tu t'es mis à faire un mix des 2 ce qui ne peut fonctionner correctement.
 
Si tu veux utiliser le async await (ce qui n'est pas une obligation):
 

Code :
  1. async function getProducts(urlToFetch) {
  2.     const results = await fetch(urlToFetch);
  3.   // et la tu as le choix de faite directement ta boucle sur products (sur products.data même je dirai)
  4.   // ou alors tu fais un return et tu fais ta boucle hors de la fonction
  5.    return results;
  6. };
  7. const url = ton_url;
  8. const products = getProducts(url);
  9. for (product of products.data) {
  10. ton code
  11. };


 
 
 
Si tu veux utiliser les promesses:
 
 

Code :
  1. const url = ton_url;
  2. fetch(url)
  3.   .then((response) => {
  4.     for (const product for reponse.data) {
  5.       // ce que tu as à faire
  6.     };
  7.   })
  8.   .catch((err) => {
  9.   console.log(err) ou ce que tu veux faire quand une erreur est retournée
  10.   });


 

n°2424160
Profil sup​primé
Posté le 12-08-2022 à 16:09:42  answer
 

Désolé pour le temps de réponse, juste pour remercier que j'écris ce message. Dans le projet, il était demandé de bien séparer les fonctions, alors je n'ai eu d'autres choix que d'utiliser async et await. J'ai fait ceci :  
 
////Récupération données API////
const url = 'http://localhost:3000/api/products'
let sofaData = [];
 
const request = async () => {
  await fetch(url)
  .then((resolve) => resolve.json())
  .then ((data) => {
    sofaData = data
  })
  .catch(function(error){
    alert('HTTP Error ' + error.status)
  })
}
 
////Fonction avec méthode pour implanter les données API dans le DOM////
const sofaList = async () => {
 
  await request()
   
    document.querySelector('#items').innerHTML = sofaData.map (
      (product) => `
 
    <a class="link-sofa" href="./product.html?id=${product._id}">
    <article>
        <img src="${product.imageUrl}" alt="${product.altTxt}">
        <h3 class="productName">${product.name}</h3>
        <p class="productDescription">${product.description}</p>
      </article>
    </a> `
    ).join("" )
}
 
sofaList()
 
Merci encore


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  Boucle for pour récupération tableau API [Résolu]

 

Sujets relatifs
Recherche Framework pour appel d'APIla Présentation de deux tableau html dans un même chartjs
[Résolu] Pb de débutant, insérer des valeurs dans un tableau[Divers][API] protocole et utilisation de service API
boucle forConfigurer les colonnes d'un tableau dans l'ordre
Utilisation de script VBS avec récupération de l'utilisateur courant p[Résolu] API Maps : info-bulle qui s'affiche plus
WordPress tableau à supprimer[Powershell]Ajouter une valeur dans un tableau dans requête reccursive
Plus de sujets relatifs à : Boucle for pour récupération tableau API [Résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR