#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');
}