> Как отменить или обработать промис в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: TYMY

Стек: JavaScript

> Пример ответа

Промисы в JavaScript нельзя отменить "из коробки" - у них нет встроенного метода .cancel(). Однако есть несколько распространённых подходов для эмуляции отмены или обработки отказа от выполнения.

1. Использование AbortController (современный способ) AbortController часто применяется с fetch, но можно адаптировать для любых промисов:

JAVASCRIPT
const controller = new AbortController();
const { signal } = controller;
const promise = new Promise((resolve, reject) => {
signal.addEventListener('abort', () => {
reject(new DOMException('Aborted', 'AbortError'));
});
// ... асинхронная работа
});
// Отмена
controller.abort();
promise.catch(err => console.log(err.name)); // 'AbortError'

2. Обёртка с флагом отмены Создаём промис, который проверяет внешний флаг:

JAVASCRIPT
function makeCancellable(promise) {
let isCancelled = false;
const wrapped = new Promise((resolve, reject) => {
promise.then(
value => isCancelled ? reject({ cancelled: true }) : resolve(value),
error => isCancelled ? reject({ cancelled: true }) : reject(error)
);
});
wrapped.cancel = () => { isCancelled = true; };
return wrapped;
}
const cancellable = makeCancellable(someAsyncTask());
cancellable.cancel(); // отменяет обработку результата

3. Promise.race с "таймаутом" Если нужно отменить по времени:

JAVASCRIPT
const timeout = (ms) => new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), ms)
);
Promise.race([originalPromise, timeout(5000)])
.then(result => ...)
.catch(err => ...); // ошибка таймаута или оригинальная

Важно: Ни один из способов не останавливает выполнение асинхронной операции (например, запрос к серверу) - он лишь игнорирует её результат. Для реальной отмены (например, HTTP-запроса) используйте AbortController с fetch.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью