我的数据库中有这个结构
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']);
}
});
在“完成呼叫”之前,您会看到“尝试循环”控制台日志。