我的数据库中有这个结构 tree 两个节点包含我的网站消息的信息,在节点'消息'我已经存储了所有消息的信息,并且存储在节点'用户消息'我创建了对这些消息的引用,例如,当用户发送消息时,该消息的密钥存储在此节点(用户消息)中,从而创建该用户的所有消息的密钥列表已发送,用于在所有已发送消息的列表中找到属于该特定用户的消息
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'来执行控制台日志。向我展示了数组,我的问题是,如何在检索数据后显示这些数据?
答案 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;完成呼叫之前的控制台日志'一个(多个)。