Перехват исключения из функции setTimeout, выполняемой внутри экземпляра объекта Promise

Уважаемые участники, подскажите пожалуйста решение.

В этом блоке кода метод catсh прекрасно перехватывает исключение:

const myPromise = new Promise(() => {
  throw new Error(`Упс! Бросили исключение.`);
});

// Перехватываем исключение в методе `catch`.
myPromise
  .catch((error) => console.log(error.message));

А в этом блоке метод catсh не будет вызван:

сonst TIMEOUT = 1000;

const mySecondPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    throw new Error(`Ошибка в асинхронной функции`);
  },
  TIMEOUT
  );
});

mySecondPromise
  .catch(() => console.log(`Этот код не будет выполнен`));

Поясните пожалуйста:

  1. Почему так происходит (предполагаю, что это связано с Event Loop)?
  2. Как переписать код так, чтобы перехват исключения в методе catch работал с setTimeout?

Всем спасибо за ответы!


Ответы (1 шт):

Автор решения: Begov

В данном примере мы явно должны указать на исключении с помощью reject

const testF = () => { throw new Error(`Упс! Бросили исключение.`) }

const genPromise = () => new Promise((resolve, reject) => {
    setTimeout(() => {
        try {
            const res = testF()
            resolve(res)
        } catch (e) { reject(e) }
    }, 1e3)
})

t1: {
    const log = console.log.bind(console, 't1:')
    const _then = log.bind(console, 'then:')
    const _catch = log.bind(console, 'catch:')

    genPromise()
        .then(_then)
        .catch(_catch)
        .then(_then)
}

t2: {
    const log = console.log.bind(console, 't2:')
    const _then = log.bind(console, 'then:')
    const _catch = log.bind(console, 'catch:')

    void async function () {
        let pRes = null
        try {
            pRes = await genPromise()
        } catch (e) {
            _catch(e.message)
        }
        _then(pRes)
    }()
}
→ Ссылка