繁体   English   中英

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

[英]How can I set data from firestore to a global variable

我正在尝试从 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 输出分数?

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

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

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

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

读:

https://javascript.info/async-await

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM