Асинхронный вызов JS печатается нормально, но выдает ошибку undefined

Я борюсь с асинхронными вызовами, и я понял, что на этот вопрос уже много раз отвечали, но я пробовал многие из предложенных подходов и не добился успеха, поэтому я был бы очень признателен, если бы кто-то мог мне помочь. Также хочу отметить, что в последнее время я очень сильно прогрессирую, но считаю себя новичком.

У меня есть асинхронный вызов базы данных (в файле controller.js), который должен вернуть все игры из таблицы Games и сохранить их в переменной allGames типа Array:

async getAllGames ({ request, response }) {
  const allGames = await Game.all()
  return response.json({
    status: 'success',
    data: allGames
  })
}

При загрузке страницы выполняется функция fetchAllGames:

created () {
  this.fetchAllGames(this.myCallback)
},
methods: {
  myCallback (response) {
    this.allGames = response
  },
  fetchAllGames (callback) {
    axios
      .get('/fetch_games')
      .then(response => {
        callback(response.data.data)
      })
  }
}

Вроде все хорошо, и здесь я должен отметить, что использую VueJS.

Когда я пытаюсь напечатать "allGames", используя

{{ allGames }}

он работает как положено, показывая массив всех игр из базы данных.

Если я попробую

{{ allGames[1] }}

Получаю вторую игру, тоже как положено.

Если я попробую

{{ allGames[1].id }}

Получаю ID второй игры с горячей перезагрузкой. Теперь, если я вручную перезагружу страницу, даже если идентификатор все еще отображается на странице, я получаю

[Vue warn]: Error in render: "TypeError: _vm.allGames[1] is undefined"

в консоли.

Моя проблема в том, что мне нужно передать allGames другому компоненту, и сейчас я передаю undefined.

Я очень ценю, если кто-нибудь из вас может пролить на меня немного света. Я уже какое-то время борюсь и пробовал много разных подходов. У меня такой же код в другом компоненте, и он, кажется, работает нормально. Я уверен, что что-то упускаю

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете {{ allGames[1].id }}, VueJS мгновенно пытается отобразить идентификатор первого элемента, который еще не существует, когда вы изначально визуализируете свою страницу, потому что данные все еще загружаются в фоновом режиме.

Вам нужно либо использовать директиву v-for, либо охранять рендеринг {{ if allGames.length ? allGames[1].id : '' }}

Что касается горячей перезагрузки: горячая перезагрузка работает иначе, чем обновление страницы. Я не эксперт, но предполагаю, что данные VueJS не очищаются должным образом при горячей перезагрузке частей сайта.

Я думаю, вы имеете в виду директиву v-if. Я пробовал использовать v-if = "allGames.length" и получил тот же результат.

pharaohlxvi 28.05.2018 22:49

Попробовал {{ allGames.length ? allGames[1].id : '' }} и снова получил точно такой же результат.

pharaohlxvi 28.05.2018 22:56

Нет. Я предположил, что это массив, и вы хотите перебрать его. Может быть, попробуйте {{ allGames.length > 1 ? allGames[1].id : '' }}, так как вы пытаетесь получить доступ ко второму элементу.

puelo 28.05.2018 22:59

Кроме того, если данные все еще загружаются при визуализации страницы, как можно распечатать массив? Я имею в виду, что даже allGames[1].id печатает нормально, но я получаю сообщение об ошибке, и данные отправляются как undefined в дочерний компонент. Я также не могу понять, почему, когда я использую allGames[1], он не выдает мне ошибку, а когда я использую allGames[1].id, он появляется, но говорит, что allGames[1] не определен (без id).

pharaohlxvi 28.05.2018 23:01

Хорошо, используя ваше последнее предложение, я получил кое-что другое: на этот раз я все еще получил ту же ошибку, но данные были переданы правильно.

pharaohlxvi 28.05.2018 23:04

Совершенно уверен, что это связано с тем, что неопределенные значения печатаются как пустые строки, но если вы обращаетесь к id на неопределенном объекте, JavaScript выдает вам ошибку. У вас есть allGames, определенный в сегменте data () вашего родительского компонента?

puelo 28.05.2018 23:06

Я еще немного поиграю с этими параметрами и вернусь сюда. Большое спасибо за твою помощь.

pharaohlxvi 28.05.2018 23:07

Да, это правильно определено.

pharaohlxvi 28.05.2018 23:07

Хорошо. Затем попробуйте использовать наблюдатель на allGames в своем дочернем компоненте, а console.info - в качестве входных данных для этого наблюдателя.

puelo 28.05.2018 23:08

Не уверен, что вы имеете в виду: я пробовал watch: { allGames: function(){ console.info (this.allGames) } }

pharaohlxvi 28.05.2018 23:13

Еще одно: если у меня <p>{{ allGames[1].id }}</p>, результат передается ребенку правильно. Если я просто прокомментирую эту строку, она будет передана как неопределенная, даже если я добавлю, например, {{ allGames.length > 1 ? allGames[1].id : '' }}

pharaohlxvi 28.05.2018 23:25

Возможно ли создать jsfiddle? Очень сложно следить за тем, что происходит.

puelo 28.05.2018 23:33

Не знаю, как бы я это сделал, чтобы он мог обращаться к базе данных и иметь несколько компонентов. Посмотрим. В любом случае спасибо за вашу помощь

pharaohlxvi 28.05.2018 23:40

Когда я вернулся, чтобы проверить, проблемы больше не было. Полагаю, я случайно изменил другую часть кода, исправляющую эту проблему. Спасибо за вашу помощь.

pharaohlxvi 30.05.2018 15:50

Другие вопросы по теме