<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Fetch API&#x2F;AJAX без jQuery]]></title><description><![CDATA[<p dir="auto"><img src="/assets/uploads/files/aa/e9/ec/1760971888562-a476d281-bc6a-4bad-a1d9-ff719afa7669-image.webp" alt="a476d281-bc6a-4bad-a1d9-ff719afa7669-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Современный JavaScript предоставляет всё необходимое для работы с API «из коробки»: <code>fetch()</code>, <code>async/await</code>, <code>AbortController</code>, потоковая обработка.</p>
<p dir="auto">Все просто, коротко и понятно.</p>
<h2>Базовый синтаксис Fetch API</h2>
<p dir="auto"><strong>Простейший GET-запрос</strong>:</p>
<pre><code class="language-js">fetch('https://api.example.com/data')
  .then(response =&gt; {
    if (!response.ok) throw new Error('Ошибка сети');
    return response.json();
  })
  .then(data =&gt; console.log(data))
  .catch(err =&gt; console.error('Ошибка:', err));
</code></pre>
<p dir="auto">Важно: <code>fetch</code> не выбрасывает ошибку при HTTP-статусах 4xx/5xx. Проверяйте <code>response.ok</code>.</p>
<p dir="auto"><strong>Современный подход</strong>: <code>async/await</code></p>
<pre><code class="language-js">async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    if (!response.ok) throw new Error(`HTTP ${response.status}`);
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('Не удалось загрузить данные:', error);
    throw error; // для обработки выше по стеку
  }
}
</code></pre>
<p dir="auto">Этот стиль стандарт де-факто в 2025 году. Он читаем, отлаживаем и легко тестируем.</p>
<p dir="auto"><code>POST</code>, <code>PUT</code>, <code>DELETE</code>: <strong>отправка данных</strong></p>
<pre><code class="language-js">const createUser = async (userData) =&gt; {
  const response = await fetch('/api/users', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Requested-With': 'XMLHttpRequest' // если нужно для legacy-бэкенда
    },
    body: JSON.stringify(userData)
  });

  if (!response.ok) {
    const errorText = await response.text();
    throw new Error(`Ошибка ${response.status}: ${errorText}`);
  }

  return await response.json();
};
</code></pre>
<p dir="auto">Лучшая практика - всегда указывайте <code>Content-Type</code>, особенно при работе с <code>JSON</code>.</p>
<p dir="auto"><code>AbortController</code> - Одна из самых недооценённых фич Fetch API.</p>
<pre><code class="language-js">const controller = new AbortController();
const { signal } = controller;

// Запуск запроса с возможностью отмены
fetch('/api/long-task', { signal })
  .then(res =&gt; res.json())
  .then(data =&gt; console.log(data))
  .catch(err =&gt; {
    if (err.name === 'AbortError') {
      console.log('Запрос отменён');
    } else {
      console.error('Ошибка:', err);
    }
  });

// Отмена через 2 секунды
setTimeout(() =&gt; controller.abort(), 2000);
</code></pre>
<p dir="auto"><strong>Применение</strong>: автокомплит, поиск в реальном времени, навигация между страницами (чтобы не обрабатывать устаревшие ответы).</p>
<hr />
<h2>Обработка ошибок: полная стратегия</h2>
<p dir="auto">Fetch требует явной обработки трёх уровней ошибок:</p>
<ul>
<li>Сетевая ошибка (нет интернета, CORS, DNS) → ловится в <code>catch</code>.</li>
<li>HTTP-ошибка (404, 500) → проверяется через <code>response.ok</code>.</li>
<li>Ошибка парсинга JSON → ловится при <code>response.json()</code>.</li>
</ul>
<pre><code class="language-js">async function safeFetch(url) {
  let response;
  try {
    response = await fetch(url);
  } catch (networkError) {
    throw new Error('Нет соединения с сервером');
  }

  if (!response.ok) {
    throw new Error(`Сервер вернул ${response.status}`);
  }

  try {
    return await response.json();
  } catch (parseError) {
    throw new Error('Некорректный формат ответа');
  }
}
</code></pre>
<hr />
<h2>Утилита для проектов: универсальный apiClient</h2>
<pre><code class="language-js">// apiClient.js
const createApiClient = (baseURL = '') =&gt; {
  const request = async (endpoint, options = {}) =&gt; {
    const url = baseURL + endpoint;
    const config = {
      headers: {
        'Content-Type': 'application/json',
        ...options.headers
      },
      ...options
    };

    const response = await fetch(url, config);

    if (!response.ok) {
      const text = await response.text();
      throw new Error(`[${response.status}] ${text || response.statusText}`);
    }

    const contentType = response.headers.get('content-type');
    return contentType?.includes('application/json') 
      ? await response.json() 
      : await response.text();
  };

  return {
    get: (endpoint) =&gt; request(endpoint, { method: 'GET' }),
    post: (endpoint, body) =&gt; request(endpoint, { method: 'POST', body: JSON.stringify(body) }),
    put: (endpoint, body) =&gt; request(endpoint, { method: 'PUT', body: JSON.stringify(body) }),
    delete: (endpoint) =&gt; request(endpoint, { method: 'DELETE' })
  };
};

// Использование
const api = createApiClient('https://api.yoursite.com/v1');
api.get('/users').then(users =&gt; console.log(users));
</code></pre>
<p dir="auto">Такой подход:</p>
<ul>
<li>Убирает дублирование кода.</li>
<li>Централизует обработку ошибок.</li>
<li>Легко расширяется (авторизация, логирование, retry-логика).</li>
</ul>
]]></description><link>https://forum.exlends.ru/topic/282/fetch-api-ajax-bez-jquery</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:25:13 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/282.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 20 Oct 2025 14:46:46 GMT</pubDate><ttl>60</ttl></channel></rss>