我正在开发一个Web应用程序,并按以下方式在Firebase中维护数据 .
“Users”节点下可以有多个节点,在每个节点中,我存储用户信息,如姓名,性别等 .
现在我尝试使用以下Javascript函数检索所有用户的名称 .
function getList(){
var nameList = new Array();
var uidList = new Array();
var query = firebase.database().ref('Users');
query.once("value").then(function(snapshot) {
snapshot.forEach(function(childSnapshot) {
var name = childSnapshot.val().Name;
var uid = childSnapshot.key;
alert(name); //first alert
nameList.push(name);
uidList.push(uid);
});
});
var len = nameList.length;
alert(len); //second alert
}
当我在浏览器上运行它时,首先它显示数组的长度为0(在第二个警报中),然后它显示从数据库中检索的名称(在第一个警报中) .
为什么在第一次警报之前执行第二次警报?从Firebase检索数据的适当方法是什么,以便我可以检测到检索到的数据,然后执行更多代码以获得 namelist
数组的长度?
我尝试使用while循环,而“name”和“uid”为null,但这不起作用 .
3 回答
承诺是处理这种情况的方法 . 使用promises进行异步调用以在将数据推送到firebase中的函数完成之后处理结果的执行,警报将显示
namelist
的长度 .试试这个:
查询的数组被重新映射到
{ name: "name", uid: "key" }
对象的数组 .您正在尝试从回调函数填充数组,回调函数将在某个时间发生 . 所以你在回调执行之前发出警报
我建议你使用promises或async