Javascript Firebase:获取有关参加活动的与会者的更多信息
通过Firebase(Web),我试图从我的活动中获得有用的信息 我的数据库结构:Javascript Firebase:获取有关参加活动的与会者的更多信息,javascript,firebase,asynchronous,firebase-realtime-database,Javascript,Firebase,Asynchronous,Firebase Realtime Database,通过Firebase(Web),我试图从我的活动中获得有用的信息 我的数据库结构: { users: "abc": { birthday: "21/07/1998", firstname: "Maxime", lastLogin: "30/07/2018" }, "def": { birthday: "12/03/1973",
{
users:
"abc": {
birthday: "21/07/1998",
firstname: "Maxime",
lastLogin: "30/07/2018"
},
"def": {
birthday: "12/03/1973",
firstname: "John",
lastLogin: "12/04/2018"
},
},
events: {
"df16s5dfs21er6zf5f1ze-": {
title: "Some great event",
members: [
"abc",
"def"
]
}
}
}
我试图在Javascript中获得的是一个包含我的所有事件、这些事件的成员以及关于这些成员的更多信息的对象。例如:
{
"df16s5dfs21er6zf5f1ze-": {
title: "Some great event",
members: {
"abc": {
firstname: "Maxime",
lastLogin: "30/07/2018"
},
"def": {
firstname: "John",
lastLogin: "12/04/2018"
}
}
}
}
正如您所看到的,只添加了“firstname”和“lastLogin”,它们应该直接从“users”节点获取
我在Javascript中尝试了多种方法,但都没有成功:(
有没有人有一个很好的解决方案可以处理这种情况的例子
我现在的代码是:
let refEvents = firebase.database().ref("/events");
let refUsers = firebase.database().ref("/users");
refEvents
.once('value')
.then((snapEvents) => {
snapEvents.forEach((snapEvent, kEvent) => {
let event = snapEvent.val();
// Iterate on event.members and write this info into event.members[key_member] = memberData;
});
});
编辑:
我尝试了以下方法,我想我只是缺少了异步/等待
这里的问题是“userProfile”日志是在循环执行之后出现的。如何处理这种情况 获取事件 获取事件函数 为一个活动获取成员 获取一个成员的配置文件
我建议您发布“尝试过的解决方案”,因为我认为您在访问每个用户详细信息的代码中不会有任何问题。我猜您的问题是您尝试使用值的位置('firstname'和'lastLogin')用户的。请注意,当您要获取用户详细信息时,调用是异步的,您需要依靠一组承诺来知道何时收到所有数据。@VivekAthalye确实是,但问题是我不知道如何使用承诺处理此情况。我无法提出第一个请求(事件)等待它获取我的所有成员(第二个请求)
refEvents
.once('value')
.then((snapshot) => {
let events = snapshot.val();
for(kEvent in events) {
console.log(kEvent, "Is an event");
let event = events[kEvent];
for(member in event.members) {
console.log(member, "Is a member of event", kEvent);
refUsers.child(member).child("/profile").once('value', (userProfile) => {
console.log("userProfile", userProfile);
});
}
}
console.log("final events", events);
dispatch({ type: FETCH_EVENTS_S, payload: cleanNewEvents(snapshot.val()) });
})
.catch((err) => {
dispatch({ type: FETCH_EVENTS_F, payload: err.message });
});
export const fetchEvents = async () => {
let finalEvents = {};
let events = await getEvents();
events = events.val();
for(kEvent in events) {
let event = events[kEvent];
let members = await getMembers(event.members);
event.members = members;
finalEvents[kEvent] = event;
}
return finalEvents;
}
const getEvents = () => {
return firebase
.database()
.ref("events")
.once("value");
}
const getMembers = async (members) => {
let profiles = {};
for(member in members) {
let profile = await getProfile(member);
let { username , image } = profile.val();
if(!image) image = "";
profiles[member] = { username, image };
}
return profiles;
}
const getProfile = (kUser) => {
return firebase
.database()
.ref("users")
.child(kUser)
.child("profile")
.once("value");
}