Я прочитал сборник о книге 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);, консоль показывает это:
Однако я не могу повторить это, консольное шоу this.checkout.length есть 0
Я также пытался использовать Object.keys, но безуспешно.
Object.keys(this.checkout).forEach(key => {
const keys = this.checkout[key];
console.info(keys);
});
Я действительно не знаю, что делать дальше.
Я прочитал много ответов в Интернете и попробовал большинство из них, но ни один из них не работает.
Пожалуйста, обновите свой вопрос, чтобы показать, как инициализируется this.checkout и как эти два фрагмента связаны друг с другом. Как ответил Мамун, вы, вероятно, регистрируете длину до загрузки данных, но невозможно сказать, не видя, как связаны два фрагмента.
@FrankvanPuffelen добавлен в код.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я предполагаю, что вы выполняете свой код до завершения запроса.
Если навести курсор на маленькую синюю иконку i, появится надпись:
Value below was evaluated just now.
Спасибо за уделенное время.
Данные загружаются из 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
});
});
}
......
Также см:
Я всегда забывал о существовании асинхронности и синхронизации. Спасибо за уделенное время.
Попробуйте
Array.from(this.checkout).forEach(...);