Можно ли создать функцию для запроса продуктов, которая возвращает промис
Что проверяют
Умеете ли вы написать асинхронную функцию без лишней обёртки и знаете ли, что fetch не считает ошибкой ответ с кодом 404 или 500. Короткий практический вопрос, по которому видно, писали ли вы слой запросов сами.
Как отвечать
Да, и в подавляющем большинстве случаев конструктор промиса не нужен: fetch возвращает промис сам, а функция с async оборачивает результат в промис автоматически.
async function fetchProducts(url, signal) {
const res = await fetch(url, { signal });
if (!res.ok) throw new Error(`Ошибка HTTP ${res.status}`);
return res.json();
}Что стоит проговорить вслух:
- успешность проверяем сами, по
res.okили по коду ответа; - отклоняем объектом
Error, а не строкой, чтобы сохранились стек и тип; - отмену даём через
AbortController, иначе ответ закрытого экрана перезапишет свежие данные; new Promiseоправдан только там, где оборачивается колбэчный или событийный интерфейс:XMLHttpRequest,FileReader, таймер.
Где спотыкаются
Заворачивают fetch в new Promise. Это известный антипаттерн, и в него обычно приезжает настоящий баг: reject не прерывает функцию, поэтому следом всё равно выполняется разбор тела, а внешний catch отклоняет промис второй раз уже другим сообщением и затирает исходную причину.
Отклоняют строкой. Обработчик, который читает error.message, получает undefined, стека нет, и в мониторинге такая ошибка выглядит пустой.
Ждут, что fetch упадёт на ответе 500. Промис отклоняется только на сетевой ошибке, обрыве и отмене, а ответ сервера с любым кодом это успех с ok === false. Отсюда классическое «данные не пришли, а блок catch молчит».