Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase:获取有关参加活动的与会者的更多信息_Javascript_Firebase_Asynchronous_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase:获取有关参加活动的与会者的更多信息

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",

通过Firebase(Web),我试图从我的活动中获得有用的信息

我的数据库结构:

{
    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");
}