Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的函数无法返回我的Firestore数据_Javascript_Html_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 我的函数无法返回我的Firestore数据

Javascript 我的函数无法返回我的Firestore数据,javascript,html,firebase,google-cloud-firestore,Javascript,Html,Firebase,Google Cloud Firestore,我有一个问题,我想从Firestore数据库中获取一个值并将其存储到一个变量中。所有这些过程都应该发生在函数内部。 但是,当我尝试返回结果并调用函数时,控制台中会出现undefined。但是如果我尝试console.log值而不是返回值,我实际上会在控制台中得到我想要的结果 我做了研究,发现我必须处理异步请求。我读了这个特别的答案,但我无法实施费利克斯·克林先生告诉我们的解决方案 我如何解决这个问题?我应该在代码中的什么位置使用async/await 首先,这是我的Firestore数据库:

我有一个问题,我想从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})
),但要记住的关键是,在异步函数完成之前,该变量是未定义的,所以你需要确保正确地等待它的设置。先生,非常感谢你对我的帮助,现在我有了一条更清晰的道路,也明白了为什么我会有这个问题。