Перейти к основному содержимому
Модуль 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) возвращает обещание, которое преобразуется в объект Response. Response.json() возвращает в свою очередь Промис с разобранным телом. Итак, вам нужно два ожидания.

Полный пример

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(), чтобы получить массив пользователей и вернуть его.

Загрузка редактора…
Показать подсказку

Два ожидают: один при извлечении, другой при .json().

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#js.m7.l3.e2
Попыток: 0Загрузка…

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

Загрузка редактора…
Показать подсказку

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

Решение доступно после 3 попыток