Странное поведение при объявлении переменной в функции
У меня есть некоторый код, вот его упрощенный смысл:
async function func(){
*1 часть кода*
data = await other_func() // без let
*2 часть кода* // эта часть не выполнится
return true // просто рандомный ответ
}
Так вот, функция работает нормально, возвращает некоторый ответ, но после определения переменной data 2 часть кода не выполняется. Ошибку не выдаёт, всё нормально работает, за исключением того, что 2 часть просто "проглатывается". Как оказалось я забыл объявить переменную через "let", после простановки его перед переменной data, всё начало корректно работать.
async function func(){
*1 часть кода*
let data = await other_func() // добавил let
*2 часть кода* // а теперь эта часть выполнится
return true // просто рандомный ответ
}
Чем объясняется такое странное поведение? Почему ошибку синтаксиса не выдало, а просто пропустило кусок кода вплоть до return?
Ответы (1 шт):
Асинхронные функции всегда возвращают промис.
Это значит, что асинхронные функции всегда возвращают "положительный" результат с точки зрения проверки на ошибки(try/catch). Однако отследить их мы можем, только лишь дождавшись выполнения самого промиса.
Код ниже не отследит ошибку, т.к. каждая функция будет передавать "промис" дальше по цепочке вызова
async function funcBad() {
data = '1'// без let
return true // просто рандомный ответ
}
async function f3() {
return funcBad()
}
async function f2() {
try {
return f3()
} catch (e) {
return 'Что то не то'
}
}
async function f1() {
return await f2();
}
f1().then(r => console.log(r))
И мы получим сообщение об ошибке
ReferenceError: data is not defined
Если мы будем ждать выполнения каждой функции, то мы перехватим ошибку и сообщения об ошибке не будет:
async function funcBad() {
data = '1'// без let
return true;
}
async function f3() {
return await func();
}
async function f2() {
let res;
try {
res = await f3();
} catch (e) {
res = 'Что то не то';
}
return res
}
async function f1() {
return await f2();
}
f1().then(r => console.log(r))
Ошибка была перехвачена в f2 и вернулось Что то не то
Таким образом, можно сделать "предположение", что какая то функция дожидается выполнения, обрабатывает ошибку и возвращает "положительный" результат.