← назад к разделу

Таймаут на ответ - только половина задачи. Вторая - прекратить саму операцию и освободить сокет, таймер и ресурсы, иначе зависшие вызовы копятся в фоне.

AbortController как общий сигнал

AbortController передает один signal всем операциям запроса. При отмене они должны завершиться соответствующей ошибкой.

const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 500);

try {
  const response = await fetch('http://payments/authorize', {
    method: 'POST',
    body: JSON.stringify({ orderId: 42 }),
    signal: controller.signal,
  });
  console.log(response.status);
} finally {
  clearTimeout(timer);
}

Таймер очищается даже при быстром ответе и при ошибке. Иначе он сработает позже и удержит процесс или вызовет отмену в неподходящий момент.

Таймаут не равен отмене произвольной работы

Если передать signal только во fetch, сетевой вызов отменится. Но вычисление в цикле, чтение очереди или чужой promise без поддержки signal продолжатся.

Для собственной операции добавляйте обработчик signal.addEventListener('abort', ...) и прекращайте работу явно. Удаляйте обработчик при завершении, особенно при повторном использовании сигнала.

AbortSignal.timeout(milliseconds) создает сигнал, который отменится сам. Он удобен для отдельного вызова, а AbortSignal.any объединяет дедлайн с отменой по shutdown.

Ошибка отмены - не ошибка сервера

Клиент мог уйти, дедлайн мог истечь, процесс мог начать остановку. В логах такие случаи отличают от отказа зависимости и не складывают в один счетчик 5xx.

Важно не глотать AbortError: по нему код понимает, что операция прекратилась штатно. Повторный запрос по таймауту выполняют только при известной идемпотентности и ограниченном числе попыток.

Коротко

  • AbortController отменяет операции через общий signal.
  • Таймер очищают в finally.
  • signal не останавливает произвольный promise или синхронный расчет.
  • Обработчики отмены удаляют при завершении.
  • Отмена по клиенту, дедлайну и shutdown отличается от отказа зависимости.

Что почитать дальше