Przejdź do głównej treści
eLearner.app
Moduł 7 · Lekcja 3 z 427/32 w kursie~14 min
Lekcje modułu (3/4)

fetch (symulowane)

Na prawdziwej stronie fetch(url) wysyła zapytanie do serwera. Tutaj, w przeglądarce do nauki, nie możemy komunikować się z zewnętrznymi serwerami, dlatego użyjemy „fałszywego” fetch: w testach wstrzykiwany jest obiekt globalThis.fetch, który zwraca predefiniowane dane. Dzięki temu możesz ćwiczyć logikę bez zależności od sieci.

Interfejs API, który Cię interesuje, jest dokładnie taki sam jak ten rzeczywisty:

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

fetch(url) zwraca Promise, które rozstrzyga się do obiektu Response. Response.json() zwraca z kolei kolejne Promise z przetworzoną zawartością (body). Dlatego potrzebne są dwa wywołania await.

Pełny przykład

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

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

Sprawdzanie poprawności odpowiedzi

fetch nie rzuca błędu, jeśli serwer odpowie kodem błędu (np. 404, 500). Wciąż zwraca obiekt Response, tyle że z właściwością ok: false:

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

fetch rzuca błąd tylko wtedy, gdy zawiedzie sama sieć (brak połączenia, błąd DNS itp.).

Wiele żądań równolegle: Promise.all

Jeśli musisz wykonać N niezależnych zapytań, uruchom je wspólnie i poczekaj na wszystkie za pomocą Promise.all:

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

Wykonywanie sekwencyjne z dwoma kolejnymi await zajęłoby prawie dwa razy więcej czasu (suma); równolegle zajmie tyle, ile najwolniejsze z nich (maksymalna wartość z obu).

Spróbuj sam

Ćwiczenie#js.m7.l3.e1
Próby: 0Ładowanie...

Zdefiniuj funkcję asynchroniczną `loadUsers()`: wywołuje fetch('/api/utenti'), a następnie .json() w celu pobrania tablicy użytkowników i ją zwraca.

Ładowanie edytora...
Pokaż wskazówkę

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

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#js.m7.l3.e2
Próby: 0Ładowanie...

Zdefiniuj funkcję asynchroniczną `loadInParallel(urls)`: przyjmuje tablicę adresów URL, wykonuje dla każdego z nich fetch + .json() równolegle za pomocą Promise.all, i zwraca tablicę odebranych obiektów JSON w tej samej kolejności.

Ładowanie edytora...
Pokaż wskazówkę

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

Rozwiązanie dostępne po 3 próbach