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())"控制台日志显示我正在将对象添加到列表中,但是当我在控制台上记录"最近的"渲染之前的列表,它显示为空。这是范围问题的变量吗?
答案 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*/ ))
});