Данные загружаются из Cloud Firestore асинхронно.Поскольку это может занять некоторое время, код после обратного вызова немедленно продолжается.Затем, когда данные доступны, Firestore вызывает ваш onSnapshot
обратный вызов.
Проще всего увидеть, что происходит, добавив несколько операторов журнала:
console.log('Before adding listener');
this.db.collection('Users').doc(uid).get()
.then((docSnapshot) =>{
console.log('Got data');
});
console.log('After adding listener');
Когда вы запускаете этот код, онпечатает:
Перед добавлением слушателя
После добавления слушателя
Получил данные
Вероятно, это не тот порядок, который вы ожидали.Но это прекрасно объясняет, почему ваши console.log(perfil)
печатает undefined
: данные еще не загружены!
Из-за этого весь код, которому необходим доступ к данным, должен находиться внутри обратного вызова onSnapshot
,Например:
this.db.collection('Users').doc(uid).get()
.then((docSnapshot) =>{
if (docSnapshot.exists) {
this.db.collection('Users').doc(uid)
.onSnapshot((doc) => {
console.log(doc.data());
perfil = doc.data();
console.log(perfil);
});
}
});
Подробнее об этом см .: