Javascript 我的函数无法返回我的Firestore数据
我有一个问题,我想从Firestore数据库中获取一个值并将其存储到一个变量中。所有这些过程都应该发生在函数内部。 但是,当我尝试返回结果并调用函数时,控制台中会出现Javascript 我的函数无法返回我的Firestore数据,javascript,html,firebase,google-cloud-firestore,Javascript,Html,Firebase,Google Cloud Firestore,我有一个问题,我想从Firestore数据库中获取一个值并将其存储到一个变量中。所有这些过程都应该发生在函数内部。 但是,当我尝试返回结果并调用函数时,控制台中会出现undefined。但是如果我尝试console.log值而不是返回值,我实际上会在控制台中得到我想要的结果 我做了研究,发现我必须处理异步请求。我读了这个特别的答案,但我无法实施费利克斯·克林先生告诉我们的解决方案 我如何解决这个问题?我应该在代码中的什么位置使用async/await 首先,这是我的Firestore数据库:
undefined
。但是如果我尝试console.log值而不是返回值,我实际上会在控制台中得到我想要的结果
我做了研究,发现我必须处理异步请求。我读了这个特别的答案,但我无法实施费利克斯·克林先生告诉我们的解决方案
我如何解决这个问题?我应该在代码中的什么位置使用async/await
首先,这是我的Firestore数据库:
这是我未定义的代码:
var userScore = 0;
var compScore = 0;
const userResult = document.getElementById("user-score");
const compResult = document.getElementById("computer-score");
const resultText = document.getElementById("pharagraph");
const rockButton = document.getElementById("r");
const paperButton = document.getElementById("p");
const scissorsButton = document.getElementById("s");
const joinButton = document.getElementById("joinid");
var firebaseConfig = {
MY FIRESTORE CONFIG..
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
const db = firebase.firestore();
function playerOne(){
db.collection("game").doc("8741").get().then((doc) => {
if (doc.exists) {
// here I get undefined
var p = doc.data().playerone;
return p;
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
})
.catch(function (error) {
console.log("Error getting document:", error);
});
}
var b = playerOne();
console.log(b);
Firestore文档是异步获取的,因此您需要正确使用承诺或使用
async/await
。以下是一种重写代码以正确处理异步的方法:
async function playerOne(){
const doc = await db.collection("game").doc("8741").get();
if (doc.exists) {
return doc.data().playerone
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
}
playerOne().then(b => console.log(b));
理解异步代码和函数闭包对于成功构建JavaScript应用程序非常重要,因此我建议您在这里进行更多的阅读和实验 你好,谢谢你抽出时间来帮助我!我尝试了你的这段代码,但得到了以下错误:uncaughtsyntaxerror:await仅在异步函数中有效。它在第42行告诉我,代码在哪里:var b=await playerOne();我编辑了我的答案,不依赖于顶级的等待。试试这个?这个有用!!!非常感谢你!但请您解释一下,我现在如何将其存储到变量(例如var result)中,然后在以后的某个地方使用result?因为如果我现在做console.log(“b”),它给我的b不是定义的,你可以从内部分配给外部变量(所以
.then(b=>{result=b})
),但要记住的关键是,在异步函数完成之前,该变量是未定义的,所以你需要确保正确地等待它的设置。先生,非常感谢你对我的帮助,现在我有了一条更清晰的道路,也明白了为什么我会有这个问题。