> Как отменить или обработать промис в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: TYMY
Стек: JavaScript
> Пример ответа
Промисы в JavaScript нельзя отменить "из коробки" - у них нет встроенного метода .cancel(). Однако есть несколько распространённых подходов для эмуляции отмены или обработки отказа от выполнения.
1. Использование AbortController (современный способ)
AbortController часто применяется с fetch, но можно адаптировать для любых промисов:
JAVASCRIPTconst 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. Обёртка с флагом отмены Создаём промис, который проверяет внешний флаг:
JAVASCRIPTfunction 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 с "таймаутом" Если нужно отменить по времени:
JAVASCRIPTconst timeout = (ms) => new Promise((_, reject) =>setTimeout(() => reject(new Error('Timeout')), ms));Promise.race([originalPromise, timeout(5000)]).then(result => ...).catch(err => ...); // ошибка таймаута или оригинальная
Важно: Ни один из способов не останавливает выполнение асинхронной операции (например, запрос к серверу) - он лишь игнорирует её результат. Для реальной отмены (например, HTTP-запроса) используйте AbortController с fetch.
> Похожие задачи по frontend
Как проверить, что первый аргумент является числом в JavaScript?
Как выполняется цикл с условием сравнения строки и числа в JavaScript?
Что такое среда исполнения JavaScript
Что представляет браузер и какие объекты он предоставляет
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью