以正确的方式从Firebase获取所有集合数据



我在我的firebase实时数据库中设置了如下方案:

{
"x" : {
"-MTBDnGW-d5m35cmcoDU" : {},
"-MTBEH4CpIqVcD-ffeJC" : {}
},
"y" : {
"-MTCaxkppXKi6eS8R7zA" : {}
},
"users" : {
"-MTBCUv6ewdVsLMan06a" : {
"name" : "xxxx",
"pin" : "x"
},
"-MTCYk2M16QiFwXrvb2_" : {
"name" : "yyyy",
"pin" : "y"
}
}
}

我的想法是从我的代码中获得数据,像这样的代码来求和每个集合的所有条目,从'users'集合中读取每个名称,并使用它们在各自的集合中计数,如本例中的x和y。

usersColection.orderByChild('name').on('child_added',function(snapshot){
var pin = snapshot.child('pin').val();
var actives = 0; //Restart for each 'user'
var pinCollection= db.ref().child(pin);
pinCollection.orderByChild('name').limitToLast(20).on('child_added', function(snapshot){
actives++; //Sum active users in the last 20 registers
});
console.log(pin,actives); //Print pin and the amount of active users for that pin name
});

但对我来说,这不喜欢正确的方式去做,因为它是异步的,不像我想要的那样在引脚名称之间迭代。我期望的输出应该是这样的,但它不能与上面的代码一起工作:

Pin x active entries: 2
Pin y active entries: 1

提前感谢。

问题是您的console.log(pin,actives)在任何actives++被调用之前运行。数据是从Firebase异步加载的,任何需要数据的代码都需要在回调函数中,一旦数据可用,回调函数就会执行。

一个解决方案是:

usersColection.orderByChild('name').on('child_added',function(snapshot){
var pin = snapshot.child('pin').val();
var pinCollection= db.ref().child(pin);

pinCollection.orderByChild('name').limitToLast(20).once('value')then((snapshot) => {
let actives = value.numChildren()
console.log(pin,actives);
});
});

你可能需要使用Promise.all()来等待所有引脚被加载,所以我建议使用承诺来处理异步数据加载。

最新更新