javascript - FRebase "pushing"数组对象不起作用

标签 javascript arrays node.js firebase firebase-realtime-database

app.get('/zones/:id/experiences', function(req,res) {
  var zone_key = req.params.id;
  var recent = [];
  var ref = firebase.database().ref('participants/'+zone_key+'/experiences');
  ref.on("value", function(snapshot) {
    snapshot.forEach((snap) => {
      firebase.database().ref('experiences').child(snap.val()).once("value").then((usersnap) => {
        recent.push(usersnap.val());
      });
    });
  console.log(recent);
  });
  res.render('experiences',{key: zone_key, list: recent});  
});

在上面的代码中,我正在查询引用点以获取一组“键”。然后,对于每个键,我查询另一个引用点以获取与该键关联的对象。然后,对于为这些键返回的每个对象,我只想将这些对象插入列表中。然后,我想将此列表传递到客户端站点,以使用渲染来处理数据。

出于某种原因,最近的 [] 永远不会被填充。它仍然是空的。这是我的变量不在范围内的问题吗?我通过控制台记录来检查引用点返回的数据,一切都很好,我得到了我想要的数据。

P.S 这样的嵌套查询可以吗? For 另一个查询中的循环

最佳答案

正如 cartant 所评论的:数据是从 Firebase 异步加载的;当您调用 res.render 时,列表仍为空。

查看这一点的一个简单方法是 1-2-3 测试:

app.get('/zones/:id/experiences', function(req,res) {
  var zone_key = req.params.id;
  var recent = [];
  var ref = firebase.database().ref('participants/'+zone_key+'/experiences');
  console.log("1");
  ref.on("value", function(snapshot) {
    console.log("2");
  });
  console.log("3");
});

当您运行此代码时,它会打印:

1

3

2

您可能期望它打印 1,2,3,但由于 on("value" 异步加载数据,情况并非如此。

解决方案是将需要访问数据的代码移至数据可用的回调中。在您的代码中,您需要原始值和连接的 usersnap 值,因此需要一些工作。

app.get('/zones/:id/experiences', function(req,res) {
  var zone_key = req.params.id;
  var recent = [];
  var ref = firebase.database().ref('participants/'+zone_key+'/experiences');
  ref.on("value", function(snapshot) {
    var promises = [];
    snapshot.forEach((snap) => {
      promises.push(firebase.database().ref('experiences').child(snap.val()).once("value"));
      Promise.all(promises).then((snapshots) => {
        snapshots.forEach((usersnap) => {
          recent.push(usersnap.val());
        }); 
        res.render('experiences',{key: zone_key, list: recent});  
      });
    });
  });
});

在此代码段中,我们使用 Promise.all 等待所有 usersnap 加载。

关于javascript - FRebase "pushing"数组对象不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47107156/

相关文章:

javascript - 如何获取收件箱中的所有邮件? (包括回复)

arrays - 使用换行符将 bash 数组写入文件

javascript - 如何使用 Node 的rest客户端上传文件

node.js - Node http 请求无序执行,导致使用随机数值的 API 出现问题

javascript - 如何使用函数使用异步等待

javascript - 自定义javascript提示和确认框

javascript - 如何访问 ReactJS 中复选框的状态?

javascript - Three.js 透明背景烟雾动画

ios - 在 Swift 中使用属性和 Map 过滤自定义对象数组

c - 为什么我的数组在 C 中返回错误的值?