Перехват исключения из функции 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(`Этот код не будет выполнен`));
Поясните пожалуйста:
- Почему так происходит (предполагаю, что это связано с Event Loop)?
- Как переписать код так, чтобы перехват исключения в методе 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)
}()
}