【发布时间】:2015-11-03 10:59:35
【问题描述】:
背景
大家好,我正在 Firebase 中执行一个检索消息列表的查询:
ref.child("messages").on("child_added", function(snapshot) {
console.log(snapshot.val());
});
上述查询工作正常。它按顺序显示消息。
一条消息包含以下属性/字段:
<message-id>: {
user-id: <user-id>,
message: "This is a sample message",
time: 1446534920014
}
问题
显示消息时,我还需要显示用户名。所以我需要添加另一个使用user-id 字段检索用户名的查询:
ref.child("messages").on("child_added", function(snapshot) {
var message = snapshot.val();
// get the user's name
ref.child("users").child(message["user-id"]).once("value", function(userSnapshot) {
// logs the results in the wrong order
console.log(message, userSnapshot.val().name);
}
});
问题是内部查询以错误的顺序返回消息列表。为什么?为了以正确的顺序显示消息,正确的方法应该是什么?
编辑
好的,给你。下面是导出的 JSON:
{
"messages" : {
"-K2FyInlsZqLdHou1QnA" : {
"message" : "Message 1",
"user-id" : "-K2Fxr1gdxynukjDzcIq"
},
"-K2FyOlw13MU9KHB5NQh" : {
"message" : "Message 2",
"user-id" : "-K2Fxr1gdxynukjDzcIq"
},
"-K2Fz2GxPgqGf8uDfK0d" : {
"message" : "Message 3",
"user-id" : "-K2Fy3uyw-RNcePo_Pn-"
}
},
"users" : {
"-K2Fxr1gdxynukjDzcIq" : {
"name" : "John Joe"
},
"-K2Fy3uyw-RNcePo_Pn-" : {
"name" : "Alfred"
}
}
}
我的目标只是显示消息(按顺序)以及用户名。如果我这样做:
ref.child("messages").on("child_added", function(snapshot) {
console.log(snapshot.val());
});
它按顺序显示消息,即消息 1、消息 2、消息 3。但我仍然没有用户名,所以我需要查看用户列表以在显示消息之前检索用户名:
ref.child("messages").on("child_added", function(snapshot) {
ref.child("users").child(snapshot.val()["user-id"]).once("value", function(userSnapshot) {
console.log(snapshot.val(), userSnapshot.val().name);
});
});
返回包含用户名的消息列表,但问题是它的顺序错误:消息 2、消息 1、消息 3
【问题讨论】:
-
“错误的顺序”是高度主观的并且无法修复,除非您向我们展示您的数据样本和您期望的顺序。请参阅stackoverflow.com/help/mcve
-
每当下载用户快照时都会调用第二个回调。一个可能在较早开始的一个之前完成下载。您无法控制该异步回调的顺序。
-
@AnidMonsur 好的,那么根据用户 ID 检索用户名的正确方法是什么?
-
@FrankvanPuffelen 我附上了邮件列表的截图。
-
您正在以正确的方式检索它。问题是您的回调结构。你的目标是什么?当然,您想做的不仅仅是 console.log。我们需要看到更多才能提供一个好的答案。
标签: firebase