Firebase中的嵌套查询,如何使用javascript显示恢复的数据?

时间:2017-01-13 14:15:44

标签: javascript for-loop firebase firebase-realtime-database

我的数据库中有这个结构 tree  两个节点包含我的网站消息的信息,在节点'消息'我已经存储了所有消息的信息,并且存储在节点'用户消息'我创建了对这些消息的引用,例如,当用户发送消息时,该消息的密钥存储在此节点(用户消息)中,从而创建该用户的所有消息的密钥列表已发送,用于在所有已发送消息的列表中找到属于该特定用户的消息

tree example

   var  RefMessage=new Firebase('https://chatfbexample.firebaseio.com/user-messages/332');
   var oMessages=[];
   var All= new Firebase('https://chatfbexample.firebaseio.com/all-messages');
   RefMessage.on("value",function(snapshot){

            snapshot.forEach(function(snap){
                var key=snap.key();
                var mensajeR=All.child(key);
              mensajeR.on('value',function(snap){
                var id=snap.val().id;
                oMessages[id]=[];
                oMessages[id]['id']=id;
               });

            });

        for(i in oMessages)
        {
            console.log(oMessages[i]['id']);
        }
        });

我将数据存储在数组中,因为我只想获取已存储的最后一个值(消息)。但是,当我尝试使用循环显示数据时,它不会向我返回任何内容,如果我检查数组,我看到这些值已经存储,实际上是在不使用' for'来执行控制台日志。向我展示了数组,我的问题是,如何在检索数据后显示这些数据?

1 个答案:

答案 0 :(得分:1)

那是因为firebase调用是异步运行的,当你的for循环执行它时,它还没有完成调用。查看承诺,然后在.on完成后链接。

如果您将代码更改为:

var RefMessage = new Firebase('https://chatfbexample.firebaseio.com/user-messages/332');
var oMessages = [];
var All = new Firebase('https://chatfbexample.firebaseio.com/all-messages');
RefMessage.on("value", function (snapshot) {

    snapshot.forEach(function (snap) {
        var key = snap.key();
        var mensajeR = All.child(key);
        mensajeR.on('value', function (snap) {
            console.log('done call');
            var id = snap.val().id;
            oMessages[id] = [];
            oMessages[id]['id'] = id;
        });

    });
    console.log('trying loop');

    for (i in oMessages) {
        console.log(oMessages[i]['id']);
    }
});

您将看到“尝试循环”#39;完成呼叫之前的控制台日志'一个(多个)。