Javascript承诺不用对象填充列表

时间:2017-11-04 22:57:56

标签: javascript jquery node.js firebase promise



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()); //push objects into the "recent" list
        });
      });
    });
  });
  res.render('experiences',{key: zone_key, list: recent}); //render the view and pass the "recent" list to the client
});




在上面的代码中,我查询我的Firebase数据库以获取一堆我想要放入列表的对象,然后将列表传递到我的客户端视图页面。出于某种原因,我从我的数据库中获取了我想要的对象但是当我执行该行时#34; recent.push(usersnap.val())"控制台日志显示我正在将对象添加到列表中,但是当我在控制台上记录"最近的"渲染之前的列表,它显示为空。这是范围问题的变量吗?

1 个答案:

答案 0 :(得分:2)

Promise.all解决之前,您无法渲染,并且需要在调用Promise.all()之前完成循环。目前,您正在尝试在循环的每次迭代中处理整个promise数组

类似的东西:

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()); //push objects into the "recent" list
      });
      return recent
    })
    .then(recent => res.render('experiences', {key: zone_key,list: recent}))
    .catch(() => res.render( /* error display config*/ ))
});