检测是否在Javascript中从Firebase检索数据

时间:2018-03-16 08:34:33

标签: javascript firebase firebase-realtime-database

我正在开发一个Web应用程序,并按以下方式在Firebase中维护数据。

enter image description here

“用户”节点下可以有多个节点,在每个节点中,我存储用户信息,如姓名,性别等。

现在我正在尝试使用以下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 个答案:

答案 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)

您正在尝试从回调函数填充数组,回调函数将在某个时间发生。所以你在回调执行之前发出警报

我建议您使用promisesasync

答案 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)
    })
}