Direkt zum Hauptinhalt springen
eLearner.app
Modul 7 · Lektion 3 von 427/32 im Kurs~14 min
Lektionen des Moduls (3/4)

fetch (simuliert)

Auf einer echten Webseite ruft fetch(url) einen Server auf. Hier im Lern-Browser können wir nicht mit externen Servern kommunizieren, daher verwenden wir ein „simuliertes“ fetch: In den Tests wird ein globalThis.fetch injiziert, das vordefinierte Daten zurückgibt, damit du die Logik üben kannst, ohne vom Netzwerk abhängig zu sein.

Die API, die dich interessiert, ist genau dieselbe wie die echte:

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

fetch(url) gibt ein Promise zurück, das zu einem Response-Objekt aufgelöst wird. Response.json() wiederum gibt seinerseits ein Promise mit dem geparsten Body zurück. Daher sind zwei await erforderlich.

Vollständiges Beispiel

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

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

Prüfen, ob es erfolgreich war

fetch wirft keinen Fehler, wenn der Server mit einem Fehlerstatus (404, 500) antwortet. Es gibt dir trotzdem eine Response, aber mit ok: false:

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

fetch wirft nur dann einen Fehler, wenn das Netzwerk ausfällt (keine Verbindung, DNS-Fehler usw.).

Mehrere Anfragen parallel: Promise.all

Wenn du N unabhängige Aufrufe durchführen musst, starte sie zusammen und warte mit Promise.all auf alle:

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

Nacheinander mit zwei aufeinanderfolgenden awaits würde fast die doppelte Zeit benötigen (Summe); parallel dauert es so lange wie die langsamste Anfrage (das Maximum von beiden).

Probier es aus

Übung#js.m7.l3.e1
Versuche: 0Wird geladen…

Definiere `loadUsers()` als async: Ruft fetch('/api/utenti') auf, ruft dann .json() auf, um das Array der Benutzer abzurufen, und gibt dieses zurück.

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#js.m7.l3.e2
Versuche: 0Wird geladen…

Definiere `loadInParallel(urls)` als async: Erhält ein Array von URLs, führt fetch + .json() für jede parallel mit Promise.all aus und gibt ein Array der empfangenen JSONs in der gleichen Reihenfolge zurück.

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar