我的数据库中有这个结构
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'的情况下进行控制台日志显示了该数组,我的问题是,检索数据后如何显示该数据?

最佳答案

这是因为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']);
    }
});


在“完成呼叫”之前,您会看到“尝试循环”控制台日志。

10-07 13:09
查看更多