Как получить данные на основе другого набора данных в Firebase? - PullRequest
0 голосов
/ 25 февраля 2019

Прежде всего: я довольно новичок в кодировании, особенно react-native и firebase, поэтому мне есть чему поучиться.

Я использую react-native, firebase и redux для создания приложения.Таким образом, в моем приложении можно создавать группы с не фиксированным количеством участников и дополнительной информацией.Структура firebase выглядит следующим образом:

{
  "groups": {
    [groupID]: {
      "members": {
        [userID]: true,
        [userID]: true,
        ...
      },
      [some more information]
    },
    [more groups...]
  },
  "users": {
    [userID]: {
      "displayName": "John",
      [some more information]
    }
  }
}

Поэтому я хочу получить последние 20 групп с отображаемыми именами ее членов и поместить их в массив, чтобы я мог использовать map-функция react-native.Это текущий код действия.

export const getGroups = (uid) => async dispatch => {
  dispatch({ type: GET_GROUPS_INFO });
  const groupData = [];
  firebase.database().ref('users/' + uid + '/groups')
    .orderByValue().limitToLast(20)
    .once('value', snapshot => {
      snapshot.forEach(childSnapshot => {
        const key = Object.keys(childSnapshot.val())[0];
        firebase.database().ref('groups/' + key)
          .once('value').then(snap => {
            const members = [];
            for (const member in snap.val().members) {
              if (member !== uid) {
                firebase.database().ref('users/' + member)
                 .once('value', childSnap => {
                  members.push(childSnap.val().displayName);
                  dispatch(getGroupMembers());
                 })
                 .catch((err) => console.log(err));
               }
            }
            groupData.push({
              [some group information]
            });
            dispatch({
              type: GET_GROUPS_INFO_SUCCESS,
              groupData
            });
          })
          .catch((err) => console.log(err));
      });
    });
};

С этим кодом у меня возникли две проблемы:

  1. Код выглядит очень некрасиво, и его трудно прочитать,Как я могу сделать его более читабельным?

  2. Я хочу добавить имена членов в массив groupData, но я не знаю, как это сделать.Число членов не фиксировано, поэтому мне нужно вызвать функцию forEach, чтобы вызвать функцию firebase, чтобы получить имена.Однако я не могу получить доступ к имени напрямую, поэтому мне нужно вызвать функцию getGroupMembers(), чтобы передать ее reducer для ее сохранения.

Я бытак благодарен, что кто-то может мне помочь!

Большое вам спасибо!

...