如何将数据从 firestore 设置为全局变量

时间:2021-07-14 10:08:29

标签: javascript firebase google-cloud-firestore

我正在尝试从 firestore 获取数据并将其设置为全局变量,但我未定义。这是我所拥有的;

let myScore;

      auth.onAuthStateChanged((user) => {
        let docRef = db.collection("players");
        let user_email = user.email;

        docRef.onSnapshot((players) => {
          players.forEach((doc) => {
            data = doc.data();
            if (user_email == data.email) {
              myScore = data.endless_score;
              console.log(myScore); //This log the right score
            }
          });
        });
      });
console.log(myScore); // This logs undefined 

如何获取 myScore,即第二个控制台日志以从 firestore 输出分数?

2 个答案:

答案 0 :(得分:1)

调用 onSnapshot 会创建对 firestore 的后台调用。它独立运行您的其余代码。所以你的第二个控制台日志实际上是在 let myScore 之后立即调用的,这意味着它仍然是未定义的。

同样,onAuthChanged 是一个观察者。它可以随机触发,具体取决于您何时登录/退出 Firestore。

对于您想要的功能,您需要重写代码以使用 async/await。

将 function() 定义为“async”,然后在您的代码中调用“await function()”将使代码在继续之前等待在线调用完成。

阅读:

https://javascript.info/async-await

答案 1 :(得分:1)

好的,据我所知,您正在尝试在用户登录时获取当前用户,但我认为附加快照侦听器不是最佳解决方案。因为首先它会被视为对每个播放器文档的读取。我建议你这样做:

  const myUser = (await (await firebase.firestore().collection("players").where("email","==",user.email).limit(1).get()).docs[0].data()

这将为您提供当前用户的数据,然后您可以通过执行 myUser.endless_score 随意使用它。它还可以降低成本,因为您只会收到一个文档,其中电子邮件等于当前用户的电子邮件

也不要忘记使箭头函数异步以便使用 await :)

相关问题