首页 文章

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

提问于
浏览
1

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

enter image description here

“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 回答

  • 1

    承诺是处理这种情况的方法 . 使用promises进行异步调用以在将数据推送到firebase中的函数完成之后处理结果的执行,警报将显示 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)
        })
    }
    
  • -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" } 对象的数组 .

  • 0

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

    我建议你使用promisesasync

相关问题