Задать вопрос
@amiznikov

Почему не выполняется деструктурирующие присваивание без условия?

Всем привет, вопрос скорее просто на рассуждение и понимание жс.
Есть такой код:
async function requestKeyParsingToken() {
  try {
    const { data } = await request({
      method: "get",
      url: TOKEN_SETTINGS,
    })    

    ({public_key: keyParsingTokenEndpoint} = data);    
  } catch (error) {
    console.log(error)
  }
}


request - под капотом этой функции обычный axios запрос
Как я написал выше код не работает, но если я поставлю условие
if(data) {
    ({public_key: keyParsingTokenEndpoint} = data);    
  }

то все будет работать.
почему так я не совсем понимаю.
у меня только такой вариант: js думает, что в data будет пусто и заранее выдает ошибку
  • Вопрос задан
  • 97 просмотров
Подписаться 1 Средний 6 комментариев
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
В таком виде, JS воспринимает всю конструкцию как единое выражение, оператор if же способствует автоматической расстановке точек с запятой.
В итоге получается такая последовательность действий:
async function requestKeyParsingToken() {
  try {
    ({public_key: keyParsingTokenEndpoint} = data);
    const {data} = await request({
      method: "get",
      url: TOKEN_SETTINGS,
    })(data);     
  } catch (error) {
    console.log(error)
  }
}
А ошибка возникает из-за использования переменной до ее объявления, что запрещено с переменными объявленными через let и const, это называется "мертвое всплытие".

P.S. таких ошибок (а так же многих других) помогает избегать eslint, конкретно в данном случае помогло бы правило semi с параметром always
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08 Куратор тега JavaScript
const { data } = await request({
      method: "get",
      url: TOKEN_SETTINGS,
    }); // точку с запятой сюда иначе следующие скобки () отработают как вызов функции. Как код отрабатывает справа на лево.


const {public_key: keyParsingTokenEndpoint} = data;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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