Вопрос об ошибке, возникшей в новом обещании

#javascript

#javascript

Вопрос:

 try {
    console.log(1)
    new Promise(() => {
        console.log(2)
        throw new Error('promise error')
    })
    console.log(3)
} catch(e) {
    console.log('hello error');
}  

Журнал этого кода 1, 2, 3 означает, что код new Promise выполняется синхронно.

Итак, почему не try catch удается перехватить Error выброс в синхронном коде?

Комментарии:

1. все ошибки в обратном вызове конструктора promise обрабатываются и отклоняют обещание.

2. Что именно вы ожидаете, что произойдет? Я не совсем понимаю вопрос…

3. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Ответ №1:

Promise Конструктор улавливает ошибку и превращает ее в отклоненное обещание. Вы не можете поймать его по той же причине, по которой второй try-catch здесь не улавливает никаких ошибок:

 function tryFunc(f) {
  try{ f() } catch (e) {}
}

try {
   console.log(1);
   tryFunc(() => {
       console.log(2);
       throw new Error();
   });
   console.log(3);
} catch (e) {
  console.log('hello error');
}  

Здесь вы можете заметить, что ошибка преобразуется в отклоненное обещание:

 console.log('Before new Promise()');

new Promise(() => {
    console.log('In new Promise()');
    throw new Error('i am an error');
}).catch((e) => console.error('Caught error:', e.message));

console.log('After new Promise()');  

Ответ №2:

Свяжите a catch() с вашим обещанием, и вы увидите, почему ваш внешний try / catch не видит ошибку, выданную в конструкторе Promise.

Конструктор Promise имеет собственную внутреннюю попытку / улов

 try {
    console.log(1)
    new Promise(() => {
        console.log(2)
        throw new Error('promise error')
    }).catch(({message})=> console.log(message));
    console.log(3)
} catch(e) {
    console.log('hello error');
}