如何从 onSnapshot 之外的 Firestore DB 获取数据

IT技术 javascript firebase google-cloud-firestore
2021-03-15 21:52:05

当我尝试从 firestore 获取值并放入变量时结果未定义,但在控制台中工作。

我的代码:

this.db.collection('Users').doc(uid).get()
  .then((docSnapshot) => {
    if (docSnapshot.exists) {
      this.db.collection('Users').doc(uid)
        .onSnapshot((doc) => {
          console.log(doc.data()); //working
          perfil = doc.data(); //not working
        });
    }
  });

console.log(perfil); //not working. Display undefined
1个回答

数据是从 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);
    });
  }
});

有关这方面的更多信息,请参阅: