Реагировать на собственный моментальный снимок Firebase внутри другого обещания разрешения снимка - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь создать экран чата, который показывает все чаты, в которых находится пользователь / (что-то похожее на мессенджер facebook, где у него есть отметка времени, lastMessage, dialogTitle и profilePicture последнего человека, отправившего сообщение)

Вот мой JSON (я хочу объединить информацию канала чатов с метаинформацией пользователя)

"Chats" : {
    "MAIN" : {
      "isPrivateChannel" : false,
      "lastMessageSent" : "Ye",
      "messageUID" : "pdXI7oALkBRPK7Gyk4cjaiGspfU2",
      "timestamp" : 1551844495595,
      "title" : "Ye",
      "users" : {
        "ZAX7EnwfLRZU8IYRMLiVMRJm3mH2" : true,
        "pdXI7oALkBRPK7Gyk4cjaiGspfU2" : true
      }
    },
    "ZAX7EnwfLRZU8IYRMLiVMRJm3mH2_pdXI7oALkBRPK7Gyk4cjaiGspfU2" : {
      "isPrivateChannel" : true,
      "lastMessageSent" : "Yo",
      "messageUID" : "ZAX7EnwfLRZU8IYRMLiVMRJm3mH2",
      "timestamp" : 1551844710716,
      "title" : "Yo",
      "users" : {
        "ZAX7EnwfLRZU8IYRMLiVMRJm3mH2" : true,
        "pdXI7oALkBRPK7Gyk4cjaiGspfU2" : true
      }
    },
    "desWJdrhJffGzp9Ou4tPFGyuGfO2_pdXI7oALkBRPK7Gyk4cjaiGspfU2" : {
      "isPrivateChannel" : true,
      "lastMessageSent" : "Ya",
      "messageUID" : "desWJdrhJffGzp9Ou4tPFGyuGfO2",
      "timestamp" : 1551844671583,
      "title" : "Ya",
      "users" : {
        "desWJdrhJffGzp9Ou4tPFGyuGfO2" : true,
        "pdXI7oALkBRPK7Gyk4cjaiGspfU2" : true
      }
    }
  },
   "users" : {
    "ZAX7EnwfLRZU8IYRMLiVMRJm3mH2" : {
      "chats" : {
        "MAIN" : true,
        "ZAX7EnwfLRZU8IYRMLiVMRJm3mH2_pdXI7oALkBRPK7Gyk4cjaiGspfU2" : true
      },
      "meta" : {
        "about" : "Nice",
        "email" : "teest3@test.com",
        "profilePicture" : "https://platform-lookaside.fbsbx.com/platform/profilepic/?...PROFILE_PIC_WOULD_BE_HERE",
        "username" : "test3"
      }
    },
    "desWJdrhJffGzp9Ou4tPFGyuGfO2" : {
      "chats" : {
        "desWJdrhJffGzp9Ou4tPFGyuGfO2_pdXI7oALkBRPK7Gyk4cjaiGspfU2" : true
      },
      "meta" : {
        "about" : "Tall",
        "email" : "test2@test.com",
        "profilePicture" : "none",
        "username" : "test2"
      }
    },
    "pdXI7oALkBRPK7Gyk4cjaiGspfU2" : {
      "chats" : {
        "MAIN" : true,
        "ZAX7EnwfLRZU8IYRMLiVMRJm3mH2_pdXI7oALkBRPK7Gyk4cjaiGspfU2" : true,
        "desWJdrhJffGzp9Ou4tPFGyuGfO2_pdXI7oALkBRPK7Gyk4cjaiGspfU2" : true
      },
      "meta" : {
        "about" : "Smart",
        "email" : "test@test.com",
        "profilePicture" : "none",
        "username" : "test"
      }
    }
  }

В настоящее время я пытаюсь сделать это со снимком внутри снимка. Тогда я подумал, что я просто собираю соответствующую информацию о пользователях, а не загружаю всех пользователей и использую какой-то фильтр или карту на переднем конце.

Вот мой код:

  export const getUserChannels = () => {
  return dispatch => {
  dispatch(loadChannels());
  let currentUserID = firebaseService.auth().currentUser.uid;

    firebaseService.database().ref("Chats").orderByChild('timestamp').once('value').then(snapshot => {
      let data = []

      snapshot.forEach((child) =>{
      const childVal = child.val();
      const promise = firebaseService
       .database()
        .ref("users/" + childVal.messageUID + '/meta').once("value").then(userSnapshot => {
          return userSnapshot.val();
        }).catch(error=> console.log(error))
        data.push({...child.val(), ...promise})
        })
      return Promise.all(data)
  }).catch(error => {
    dispatch(loadChannelsError(error.message));
  }).then( data => {
    console.log("DATAAAA", JSON.stringify(data));
    const filteredData = data.filter(chat => chat.users[`${currentUserID}`] === true);
    dispatch(loadChannelsSuccess(filteredData));
  })
}
}

И вот проблема, с которой я сталкиваюсь:

enter image description here

Я не могу понять, как получить обещание для разрешения внутри оператора forEach. Я пробовал много разных способов разрешения обещания, и синтаксис ожидания асинхронности также ожидался, но мне не удалось разрешить это обещание до отправки в данные.

...