Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 firebase查询后数组未保存值的问题_Javascript_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript firebase查询后数组未保存值的问题

Javascript firebase查询后数组未保存值的问题,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,函数完成后,不会更新变量HardProblems。它正在循环中更新,但不保存。这是firebase呼叫。e、 g.HardProblems.length为0,但应为非零 function getHardProblems(){ var HardProblems = []; var foo = []; db.collection("hardproblems") .get() .then(function(querySnapshot) { querySnapshot.f

函数完成后,不会更新变量HardProblems。它正在循环中更新,但不保存。这是firebase呼叫。e、 g.HardProblems.length为0,但应为非零

function getHardProblems(){
  var HardProblems = [];
  var foo = [];
  db.collection("hardproblems")
  .get()
  .then(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
          // doc.data() is never undefined for query doc snapshots
          //console.log(doc.id, " => ", doc.data());
          HardProblems.push({docID: doc.id, ...doc.data()});
      });
  })
  .catch(function(error) {
      console.log("Error getting documents: ", error);
  });

  console.log("Got Hard Problems "+HardProblems.length)
}

如果要在异步代码之外记录硬问题,请将其移动到
then()
块:

function getHardProblems(){
  var HardProblems = [];
  var foo = [];
  db.collection("hardproblems")
  .get()
  .then(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
          // doc.data() is never undefined for query doc snapshots
          //console.log(doc.id, " => ", doc.data());
          HardProblems.push({docID: doc.id, ...doc.data()});
      });
    console.log("Got Hard Problems " + HardProblems.length) // have to have this in the 'then()' block
  })
  .catch(function(error) {
      console.log("Error getting documents: ", error);
  });
}
JavaScript将在主区域中的所有内容运行后运行异步代码。因此,当您记录
硬问题时,即使是在程序源中的异步代码之后,它也会在异步代码运行之前执行,这就是为什么您会看到一个空数组,因为它仍然是空的


Flavio很好地解释了异步代码和事件循环的工作原理。

您在
then()
的成功回调中异步更新了
硬问题。尝试在foreach之后添加log-in回调方法。我想说的是,在查询之后,硬问题将被清除。我通过在方法中不声明硬问题(甚至在全局声明后也不初始化)来修复它。IDK这是怎么解决的。哦,是的,这只是范围界定。如果在函数体中声明了某个内容,则该内容仅在该函数的生命周期内持续,而不是在该函数完成之后。是的,在全局范围内声明硬问题可以解决这个问题。您也可以只从函数返回硬问题(只要它在.then()中),然后从外部访问它。