Я пытаюсь создать экран чата, который показывает все чаты, в которых находится пользователь / (что-то похожее на мессенджер 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](https://i.stack.imgur.com/yANCz.png)
Я не могу понять, как получить обещание для разрешения внутри оператора forEach. Я пробовал много разных способов разрешения обещания, и синтаксис ожидания асинхронности также ожидался, но мне не удалось разрешить это обещание до отправки в данные.