我正在尝试从 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 输出分数?
答案 0 :(得分:1)
调用 onSnapshot 会创建对 firestore 的后台调用。它独立运行您的其余代码。所以你的第二个控制台日志实际上是在 let myScore 之后立即调用的,这意味着它仍然是未定义的。
同样,onAuthChanged 是一个观察者。它可以随机触发,具体取决于您何时登录/退出 Firestore。
对于您想要的功能,您需要重写代码以使用 async/await。
将 function() 定义为“async”,然后在您的代码中调用“await function()”将使代码在继续之前等待在线调用完成。
阅读:
答案 1 :(得分:1)
好的,据我所知,您正在尝试在用户登录时获取当前用户,但我认为附加快照侦听器不是最佳解决方案。因为首先它会被视为对每个播放器文档的读取。我建议你这样做:
const myUser = (await (await firebase.firestore().collection("players").where("email","==",user.email).limit(1).get()).docs[0].data()
这将为您提供当前用户的数据,然后您可以通过执行 myUser.endless_score 随意使用它。它还可以降低成本,因为您只会收到一个文档,其中电子邮件等于当前用户的电子邮件
也不要忘记使箭头函数异步以便使用 await :)