Ответ вслух Middle Код-ревью спрашивают часто обновлено

Ревью: загрузка деталей по списку

Вопрос

Перед тобой код на ревью. Скажи вслух, что здесь не так - по убыванию важности.

Читай вслух, как на ревью: сначала что делает код, потом что сломано.

async function loadDetails(ids) {
  const result = [];
  for (const id of ids) {
    const res = await fetch(`/api/item/${id}`);
    const data = await res.json();
    result.push(data);
  }
  return result;
}

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Главное - последовательность. Сто идентификаторов по 200 мс - двадцать секунд.

Что должно прозвучать в ответе

  • запросы идут строго последовательно - время растёт линейно

  • нет проверки res.ok - fetch не бросает на 404 и 500

  • json() упадёт на пустом теле или HTML-ответе

  • нет ограничения параллельности при простой замене на Promise.all

  • нет отмены и таймаута

  • один упавший запрос при Promise.all уронит всё - нужен allSettled или обработка

Что могут спросить следом

  • Как ограничить параллельность до пяти?
  • Что лучше при частичном отказе - all или allSettled?

Разбор

Главное - последовательность. Сто идентификаторов по 200 мс - двадцать секунд. Простая замена:

const result = await Promise.all(ids.map(async (id) => { ... }));

Но с оговоркой, которую и ждут услышать: сто одновременных запросов - это уже атака на собственный сервер и упор в лимит соединений браузера. Правильный ответ - пул ограниченной параллельности, скажем по пять.

fetch не бросает на HTTP-ошибках. При 500 в res.json() прилетит HTML страницы ошибки, и упадёт разбор, а не запрос - сообщение будет бессмысленным. Нужна проверка res.ok.

Поведение при частичном отказе надо выбрать осознанно: Promise.all теряет всё из-за одного сбоя, allSettled вернёт что получилось.

И нет ни таймаута, ни отмены: при уходе со страницы запросы продолжают идти.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.