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

Boucle for pour récupération tableau API [Résolu] - Javascript/Node.js - Programmation

Marsh Posté le 22-06-2022 à 18:05:19    

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
Reply

Marsh Posté le 22-06-2022 à 18:05:19   

Reply

Marsh Posté le 22-06-2022 à 18:09:52    

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.

Reply

Marsh Posté le 22-06-2022 à 18:18:07    

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

Reply

Marsh Posté le 23-06-2022 à 19:43:31    

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.

Reply

Marsh Posté le 23-06-2022 à 19:50:01    

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é

Reply

Marsh Posté le 23-06-2022 à 20:05:02    

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
Reply

Marsh Posté le 23-06-2022 à 21:58:32    

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


 
Tout simplement ;)

Reply

Marsh Posté le 23-06-2022 à 22:04:24    

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.

Reply

Marsh Posté le 24-06-2022 à 18:17:10    

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à.

Reply

Marsh Posté le 24-06-2022 à 19:33:55    

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()

Reply

Marsh Posté le 24-06-2022 à 19:33:55   

Reply

Marsh Posté le 30-06-2022 à 19:49:46    

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.   });


 

Reply

Marsh Posté le 12-08-2022 à 16:09:42    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed