Перейти до основного вмісту
Модуль 7 · Урок 3 із 427/32 у курсі~14 min
Модульні уроки (3/4)

вибірка (імітація)

На реальній сторінці fetch(url) викликає сервер. Тут, у навчальному браузері, ми не можемо зв’язуватися із зовнішніми серверами, тому ми будемо використовувати «підробку» fetch: у тестах globalThis.fetch впроваджено, що повертає попередньо визначені дані, тому ви можете практикуватися на логіка незалежно від мережі.

API, який вас цікавить, такий самий, як справжній:

JS
const response = await fetch('/api/utenti');
const data = await response.json();

fetch(url) повертає Promise, який вирішує об’єкт Response. Response.json() повертається in turn Promise з розібраним тілом. Тож вам потрібно два очікування.

Повний приклад

JS
async function loadUsers() {
  const response = await fetch('/api/utenti');
  const users = await response.json();
  return users;
}

const list = await loadUsers();
// [{...}, {...}]

Перевіряємо, чи вдалося

fetch не викидає, якщо сервер відповідає зі статусом помилки (404, 500). Це все ще дає вам Response, але з ok: false:

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

fetch викидає, лише якщо мережа не працює (немає з’єднання, DNS, ...).

Кілька запитів паралельно: Promise.all

Якщо вам потрібно зробити N незалежних викликів, запустіть їх разом і зачекайте на всі з Promise.all:

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

Послідовно з двома послідовними await це займе майже вдвічі більше часу (сума); паралельно це максимум з двох (найповільніший).

Спробуйте

вправи#js.m7.l3.e1
Спроби: 0Завантаження…

Визначте асинхронний `loadUsers()`: викличте fetch('/api/utenti'), потім .json(), щоб отримати масив користувачів і повернути його.

Завантаження редактора…
Показати підказку

Два очікують: один на fetch, один на .json().

Рішення доступне після 3 спроб

Повторна вправа

вправи#js.m7.l3.e2
Спроби: 0Завантаження…

Визначте `loadInParallel(urls)` async: отримайте масив URL-адрес, виконайте fetch + .json() для кожної з них паралельно з Promise.all і поверніть масив отриманих значень JSON у тому самому порядку.

Завантаження редактора…
Показати підказку

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

Рішення доступне після 3 спроб