Ревью: загрузка деталей по списку
Вопрос
Перед тобой код на ревью. Скажи вслух, что здесь не так - по убыванию важности.
Читай вслух, как на ревью: сначала что делает код, потом что сломано.
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 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
запросы идут строго последовательно - время растёт линейно
нет проверки 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 ошибок.