Promise executor, почему нельзя уловить ошибку внутри executor с помощью try-catch?

Для теста сделал такой сниппет.
try {
  new Promise(() => {
    console.log('run promise')
    throw new Error('custom error')
  }).catch(() => {
    console.log('error catched in .catch')
  })
} catch {
  console.log('error catched in try-catch')
}

console.log('after test')


Он выводит такой результат

run promise
after test
error catched in .catch


error catched in try-catch - на сработал.
В доках по промисам пишется, что executor промиса работает
в текущем основном потоке. В этом нету сомнений run promise выводится раньше
after test.

Но я не понял почему если эта операция выполняется синхронно, почему
я не могу ее уловить через try-catch?
Я так понимаю что executor промиса выполняется вне call stack текущего потока - поэтому try-catch тут бессилен.

Как это тогда работает? для executor промиса создается свой отдельный callstack?
Подскажите пожайлуйста кто знает ответ, если будет ссылка где описывается почему тут try-catch не работает
будет очень полезно, спасибо заранее.
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
kosuha
@kosuha Автор вопроса
js | web
А я кажется и сам понял что throw Error - равносильно вызову reject и это уже идет через очередь промисов

Значит executor обернут в try-catch внутри реализации Promise.
И значит всетаки executor - выполняется в обычном call stack
Просто ошибка внутри обрабабтывается
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm
Архитектор решений
Ну так правильно ошибку выбрасывай, ты должен разрешить промис ошибкой, тогда она выбросится:
try {
  new Promise((success, error) => {
    console.log('run promise')
    error('custom error');
  });
} catch(err) {
  console.error(err)
}

console.log('after test')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы