Passer au contenu principal
eLearner.app
Module 7 · Leçon 3 sur 427/32 dans le cours~14 min
Leçons du module (3/4)

fetch (simulé)

Sur une vraie page, fetch(url) appelle un serveur. Ici, dans le navigateur d'apprentissage, nous ne pouvons pas communiquer avec des serveurs externes, nous utiliserons donc un « faux » fetch : dans les tests, un globalThis.fetch est injecté pour renvoyer des données prédéfinies, ce qui vous permet de vous exercer sur la logique sans dépendre du réseau.

L'API qui vous intéresse est exactement la même que l'API réelle :

JS
const risposta = await fetch('/api/utenti');
const dati = await risposta.json();

fetch(url) retourne une Promise qui se résout en un objet Response. Response.json() retourne à son tour une Promise contenant le corps décodé. Il faut donc deux await.

Exemple complet

JS
async function caricaUtenti() {
  const risposta = await fetch('/api/utenti');
  const utenti = await risposta.json();
  return utenti;
}

const lista = await caricaUtenti();
// [{...}, {...}]

Vérifier si tout s'est bien passé

fetch ne lève pas d'erreur si le serveur répond par un code d'erreur (404, 500). Il vous renvoie tout de même une Response, mais avec ok: false :

JS
const r = await fetch('/api/utenti');
if (!r.ok) {
  throw new Error(`HTTP ${r.status}`);
}
const dati = await r.json();

fetch ne lève une erreur que si le réseau échoue (pas de connexion, problème DNS, ...).

Plusieurs requêtes en parallèle : Promise.all

Si vous devez effectuer N appels indépendants, lancez-les ensemble et attendez-les tous avec Promise.all :

JS
const [u, p] = await Promise.all([
  fetch('/api/utenti').then((r) => r.json()),
  fetch('/api/prodotti').then((r) => r.json()),
]);

En série avec deux await consécutifs, cela prendrait presque le double du temps (somme) ; en parallèle, cela prend le temps du plus long (le maximum des deux).

À vous de jouer

Exercice#js.m7.l3.e1
Tentatives : 0Chargement…

Définissez `loadUsers()` en mode async : appelle fetch('/api/utenti'), puis .json() pour obtenir le tableau d'utilisateurs, et le retourne.

Chargement de l'éditeur…
Afficher l'indice

Due await: uno su fetch, uno su .json().

Solution disponible après 3 tentatives

Exercice de révision

Exercice#js.m7.l3.e2
Tentatives : 0Chargement…

Définissez `loadInParallel(urls)` en mode async : reçoit un tableau d'URL, effectue fetch + .json() sur chacune en parallèle avec Promise.all, et retourne un tableau des objets JSON reçus, dans le même ordre.

Chargement de l'éditeur…
Afficher l'indice

urls.map((u) => fetch(u).then(r => r.json())) e Promise.all.

Solution disponible après 3 tentatives