async function loadOrder(id, signal) {
const res = await fetch(`/api/orders/${id}`, { signal, headers: { Accept: "application/json" } });
if (!res.ok) throw new Error(`HTTP ${res.status}`); // fetch не бросает на 4xx/5xx
return res.json();
}
const ctrl = new AbortController();
loadOrder(42, ctrl.signal);
ctrl.abort(); // например, при уходе со страницы
Что важно знать
fetchотклоняет промис только при сетевой ошибке; коды 4xx и 5xx нужно проверять черезres.ok.- Отправка JSON:
method: "POST",body: JSON.stringify(data), заголовокContent-Type: application/json. - CORS: запрос на другой домен браузер разрешит, только если сервер ответил нужными заголовками; «непростые» запросы предваряются preflight
OPTIONS. Это защита браузера, а не сервера. - Cookies на другой домен —
credentials: "include"и согласие сервера. - Состояния загрузки и ошибки, повторы с паузой, гонки ответов (старый ответ пришёл позже нового) — отмена через
AbortController. - В приложениях серверное состояние обычно ведут библиотеки вроде TanStack Query: кэш, повторы, обновление в фоне.