FIREBASE получает данные документа

#javascript #typescript #firebase #google-cloud-firestore #angularfire2

#javascript #typescript #firebase #google-облако-firestore #angularfire2

Вопрос:

Я создаю приложение и пытаюсь получить данные о продукте по его идентификатору внутри модального в ionic 4. Я использую typescript для этого, но безуспешно. Поскольку вызовы de для firebase являются асинхронными, я не могу получить данные, которые хранятся в firebase, а также потому, что я новичок в теме, я не могу понять, как правильно писать код. Я читал о том, как это сделать, но мне трудно этого добиться.

Вот моя функция, которая пытается получить данные о продукте из firebase. Он всегда регистрируется пустым в console.log (‘todo’, todo).

 async editProduct(id) {
        const getTodo = docRef => {
            setTimeout(() => {
                docRef = this.afs.collection("products").doc(id);
                docRef.get().subscribe((doc) => {
                    if (doc.exists) {
                        let data = doc.data();
                        return data;
                    } else {
                        console.log("No document.");
                        return false;
                    }
                });
            }, 2000)
        }

        getTodo(todo => {
            console.log('todo', todo)
        })

        const modal = await this.modalCtrl.create({
            component: AdminProductPage,
            'id': id,
        });
        await modal.present();
    }
 

Ответ №1:

Что-то не так с вашим «getTodo». Вероятно, вы регистрируете пустые данные в своем коде, я могу привести вам правильный функциональный пример:

 myData

editProduct() {
    this.afs.collection("products").doc(id)
        .valueChanges()
        .subscribe(data => {
          console.log(data)
          myData = data
        })
}

getData() {
    console.log(this.myData) // You will log it twice with this line
}
 

ПРИМЕР GOOGLE

 docRef.get().then((doc) => {
    if (doc.exists) {
        console.log("Document data:", doc.data());
    } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
    }
}).catch((error) => {
    console.log("Error getting document:", error);
});
 

https://firebase.google.com/docs/firestore/query-data/get-data?hl=es

Комментарии:

1. Спасибо. Ваш ответ указал мне направление для решения проблемы

2. На случай, если кто-то еще, читающий это, задается вопросом, почему это не сработало: он возвращал пустой, потому что не было никаких последующих действий по обещанию async .then() , это означает, что он, вероятно, возвращает данные, но к моменту печати данные не были готовы. Также не забывайте всегда использовать .catch() при работе с асинхронными функциями.