Массив объекта JSON не пуст, но не может выполнять итерацию с foreach, показывать нулевую длину

Я прочитал сборник о книге checkout из firestore в create().

Данные хранятся в массиве checkout, объявленном в data().

export default {
  name: "checkout-history",
  data() {
    return {
      checkout: []
      ]
    };
  },
  created() {
    db.collection("checkout")
        .get()
        .then(querySnapshot => {
          querySnapshot.forEach(doc => {
            const data = {
              id: doc.id, // firebase document id
              book_did: doc.data().book_did,
              borrowed_date: doc.data().borrowed_date,
              copies_did: doc.data().copies_did,
              due_date: doc.data().due_date
            };
            this.checkout.push(data); // push to array
          });
        });

      console.info(this.checkout)  // show data, as in the image below

      console.info(this.checkout.length)  // get 0
      console.info(Object.keys(this.checkout).length)  // get 0
      }
      ......

Когда я запускаю console.info(this.checkout);, консоль показывает это:

Массив объекта JSON не пуст, но не может выполнять итерацию с foreach, показывать нулевую длину

Однако я не могу повторить это, консольное шоу this.checkout.length есть 0

Я также пытался использовать Object.keys, но безуспешно.

Object.keys(this.checkout).forEach(key => {
     const keys = this.checkout[key];
     console.info(keys);
});

Я действительно не знаю, что делать дальше.

Я прочитал много ответов в Интернете и попробовал большинство из них, но ни один из них не работает.

Попробуйте Array.from(this.checkout).forEach(...);

Tino Caer 22.07.2019 16:10

Пожалуйста, обновите свой вопрос, чтобы показать, как инициализируется this.checkout и как эти два фрагмента связаны друг с другом. Как ответил Мамун, вы, вероятно, регистрируете длину до загрузки данных, но невозможно сказать, не видя, как связаны два фрагмента.

Frank van Puffelen 22.07.2019 16:12

@FrankvanPuffelen добавлен в код.

No One 22.07.2019 16:33
Поведение ключевого слова "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
3
215
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предполагаю, что вы выполняете свой код до завершения запроса.

Если навести курсор на маленькую синюю иконку i, появится надпись:

Value below was evaluated just now.

Спасибо за уделенное время.

No One 22.07.2019 16:51
Ответ принят как подходящий

Данные загружаются из Firestore (и из большинства современных веб-API) асинхронно. Это означает, что остальная часть вашего кода продолжает выполняться после запуска запроса, а затем, когда данные возвращаются из базы данных, вызывается ваш обратный вызов then(). Это, в свою очередь, означает, что весь код, которому требуется доступ к данным из базы данных, должен находиться внутри обратного вызова then().

db.collection("checkout")
    .get()
    .then(querySnapshot => {
      querySnapshot.forEach(doc => {
        const data = {
          id: doc.id, // firebase document id
          book_did: doc.data().book_did,
          borrowed_date: doc.data().borrowed_date,
          copies_did: doc.data().copies_did,
          due_date: doc.data().due_date
        };
        this.checkout.push(data); // push to array

        console.info(this.checkout)  // show data, as in the image below

        console.info(this.checkout.length)  // get 0
        console.info(Object.keys(this.checkout).length)  // get 0
      });
    });

  }
  ......

Также см:

Я всегда забывал о существовании асинхронности и синхронизации. Спасибо за уделенное время.

No One 22.07.2019 16:50

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