Что такое AbortController и метод abort в JavaScript
Что проверяют
Умеете ли вы отменять начатую работу, а не просто игнорировать её результат. На фронтенде это ежедневная история: пользователь печатает в поиске, уходит со страницы, компонент размонтируется, а старые запросы продолжают жить и приходить не в том порядке.
Как отвечать
AbortController это объект с сигналом. Сигнал передаётся в асинхронную операцию, а вызов abort переводит его в отменённое состояние и уведомляет подписчиков. Сам по себе контроллер ничего не прерывает: отмену обязан поддерживать тот, кому сигнал отдали. fetch поддерживает, addEventListener принимает signal и сам снимает обработчик, многие библиотеки тоже умеют.
const ctrl = new AbortController();
const res = await fetch(url, { signal: ctrl.signal });
ctrl.abort(); // промис отклоняется ошибкой с name "AbortError"Что стоит добавить: отклонённый промис нужно ловить и отличать отмену от настоящей ошибки по имени или по signal.reason; контроллер одноразовый, на каждый запрос создаётся новый; отмена действует и на чтение тела ответа; есть готовые AbortSignal.timeout для дедлайна и AbortSignal.any для объединения нескольких причин. В React сигнал создают в эффекте и вызывают abort в функции очистки.
Где спотыкаются
Думают, что abort отменяет любой промис. Промис отменить нельзя: обычная асинхронная функция досчитает до конца, если внутри никто не смотрит на сигнал.
Переиспользуют один контроллер на все запросы. После abort сигнал остаётся отменённым навсегда, и следующий запрос падает сразу, даже не уйдя в сеть.
Считают отмену решением гонки данных на сервере. Запрос уже ушёл, сервер работу выполнил и, возможно, что-то записал. Отмена экономит рендер и трафик клиента, но побочный эффект на сервере не откатывает.