У меня есть функция, которая получает данные из Firestore, но всегда возвращает значение undefined. Раньше я использовал метод .get(), но я хочу, чтобы мои данные автоматически обновлялись, когда база данных получает новые данные.
Я знаю, что .onSnapshot() не возвращает обещание, поэтому использование асинхронного режима невозможно.
getdata = (dbRef) => {
dbRef.onSnapshot(snapshot => {
console.info(snapshot);
return snapshot;
});
}
Журнал отображает моментальный снимок в консоли, но когда я вызываю эту функцию, она возвращает undefined



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


Ваш вопрос не очень ясен. Если вы пытаетесь получать обновления в реальном времени, используйте эту модель из этой документации https://firebase.google.com/docs/firestore/query-data/listen.
db.collection("cities").doc("SF")
.onSnapshot(function(doc) {
console.info("Current data: ", doc.data());
});
если вы пытаетесь получить одноразовые данные, используйте эту модель из этой документации https://firebase.google.com/docs/firestore/query-data/get-data
docRef.get().then(function(doc) {
if (doc.exists) {
console.info("Document data:", doc.data());
} else {
// doc.data() will be undefined in this case
console.info("No such document!");
}
Я думаю, что документ действительно ясно об этом.
И, кстати, я уверен, что обновления onSnapshot в реальном времени также асинхронны. Если вы хотите получать обновления в режиме реального времени, вы не можете использовать его. Для функции используйте одновременную модель данных. Вот очень хороший пример для обновлений в реальном времени
Вы можете прочитать учебник по этой ссылке "слушать обновления в реальном времени"
db.collection("cities")
.onSnapshot(function(querySnapshot) {
let cities = [];
querySnapshot.forEach(function(doc) {
cities.push(doc.data());
});
});