我正在开发一个Web应用程序,并按以下方式在Firebase中维护数据。
“用户”节点下可以有多个节点,在每个节点中,我存储用户信息,如姓名,性别等。
现在我正在尝试使用以下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,但这不起作用。
答案 0 :(得分:1)
试试这个:
function getList() {
var query = firebase.database().ref('Users');
query.once("value").then(snapshots => snapshots.map(snapshot => ({
name: snapshot.val().Name,
uid: snapshot.key
}))).then(result => {
console.log(result);
});
}
将查询的数组重新映射到{ name: "name", uid: "key" }
个对象的数组。
答案 1 :(得分:0)
答案 2 :(得分:-1)
承诺是处理此类情况的方法。
在将数据推送到firebase中的函数完成后,使用promises进行异步调用来处理结果的执行,警报将显示namelist
的长度。
function getList(){
var nameList = new Array();
var uidList = new Array();
var query = firebase.database().ref('Users');
let getData = new Promise((resolve, reject) => {
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);
});
resolve(nameList)
})
});
getData.then((nameList) => {
alert(nameList.length)
})
}