函数完成后,不会更新变量HardProblems。它正在循环中更新,但不会保存。这是一个firebase电话。例如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)
}

最佳答案

您正在异步代码之外记录HardProblems,将其移到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将运行异步代码。因此,当您记录HardProblems时,即使它是在程序源代码中的异步代码之后,它也会在运行异步代码之前被执行,因此这就是您看到一个空数组的原因,因为它仍然是空的。

Flavio很好地解释了异步代码和事件循环如何工作here

关于javascript - Firebase查询后数组不保存值的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60923557/

10-11 07:23