Есть ли способ остановить Promise

Ответ

Да, стандартный Promise в JavaScript нельзя отменить напрямую, но есть несколько подходов:

  1. AbortController (современный способ):
const controller = new AbortController();
const signal = controller.signal;

fetch(url, { signal })
  .then(response => response.json())
  .catch(err => {
    if (err.name === 'AbortError') {
      console.log('Fetch aborted');
    }
  });

// Для отмены:
controller.abort();
  1. Флаг отмены (ручной способ):
let isCancelled = false;

new Promise((resolve, reject) => {
  // Проверяем флаг
  if (isCancelled) reject('Cancelled');
  // Логика промиса
}).catch(console.log);

// Для отмены:
isCancelled = true;
  1. Сторонние библиотеки (например, Bluebird) имеют встроенные методы отмены.

Важно: отмена не останавливает выполнение кода внутри промиса, а только предотвращает вызов then/catch после отмены.

Ответ 18+ 🔞

А, ну это классика, блядь! Стандартный Promise в JavaScript — он как упрямый осел, его просто так не отменишь, пиздец. Но народ, конечно, придумал, как ему мозги вынести, есть несколько подходов.

  1. AbortController (это типа по-модному, современный способ):
const controller = new AbortController();
const signal = controller.signal;

fetch(url, { signal })
  .then(response => response.json())
  .catch(err => {
    if (err.name === 'AbortError') {
      console.log('Fetch aborted');
    }
  });

// А вот тут, когда надо всё послать нахуй:
controller.abort();
  1. Флаг отмены (дедовский, ручной способ, в лоб):
let isCancelled = false; // Стоит флажок, типа "всё спокойно, блядь"

new Promise((resolve, reject) => {
  // Сразу глядим — а не отменили ли нас уже, пока мы тут думали?
  if (isCancelled) reject('Cancelled');
  // Ну а дальше уже своя логика промиса, епта
}).catch(console.log);

// А потом бац — и меняем погоду в доме:
isCancelled = true; // Всё, пиздец, отмена!
  1. Сторонние библиотеки — там, всякие Bluebird и прочая шушера. У них уже встроены методы отмены, как будто так и надо.

Но главное, ёпта, запомни, как отче наш: отмена промиса — это не волшебная кнопка "СТОП". Она не вырубает нахуй код, который уже внутри промиса бежит. Она просто делает так, что после отмены then или catch уже не вызовутся, всё. Как будто ты пообещал другу бутылку, а потом передумал — он-то уже пошёл в магазин, пидарас, но ты ему звонишь и говоришь "не надо". Понимаешь, да?