Таймаут на ответ - только половина задачи. Вторая - прекратить саму операцию и освободить сокет, таймер и ресурсы, иначе зависшие вызовы копятся в фоне.
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 отличается от отказа зависимости.
Что почитать дальше
- Процессы и cluster - зачем shutdown нужен таймаут.
- Event-loop lag - когда очередь растет быстрее обработки.