javascript - firebase 查询后数组不保存值的问题

标签 javascript firebase google-cloud-firestore

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

最佳答案

您正在异步代码之外记录 HardProbles,请将其移至 then() block 中:

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/

相关文章:

javascript - 通过BATCH调用PHP文件

javascript - 无法从 JavaScript 客户端对象模型文件夹内的 SharePoint 文档中检索元数据

ios - 突然 fcm 通知在某些 iOS 设备上不起作用

firebase - Firestore 文档最大写入速率说明

swift - Firebase Firestore 弄乱了数组的顺序

flutter - 如何在顶部附加新的 ListView 项

javascript - 数组返回indexOf而不是模式计数

javascript - 在 2 个不同区域重复循环时该怎么办

android - Firebase 不向 ListView 显示数据

ios - 使用 Firebase 登录 Facebook。找不到 OAuth 重定向 URI