【发布时间】:2020-11-19 21:57:39
【问题描述】:
我正在尝试创建一个聊天应用程序,但出现了一个小问题。每当我从 firebase 加载消息时,它们都会以未排序的顺序出现在聊天应用程序中,因此我尝试按时间戳对消息进行排序,以便它们按顺序显示。如果我在 useEffect 的 onReceive 中移动 sort 和 setMessages,我可以做到这一点,但我觉得这将非常低效,因为它会为从 firebase 检索到的每条消息单独排序和设置消息。在所有消息都加载到数组中之后,我想在最后做这一切。
现在有了我的日志,我明白了:
[REDACTED TIME] LOG []
[REDACTED TIME] LOG pushing into loadedMessages
[REDACTED TIME] LOG pushing into loadedMessages
所以它首先打印(空)数组,然后加载消息。如何确保以正确的顺序完成此操作?
useEffect(() => {
// Gets User ID
fetchUserId(getUserId());
const messagesRef = firebase.database().ref(`${companySymbol}Messages`);
messagesRef.off();
messagesRef.off();
const onReceive = async (data) => {
const message = data.val();
const iMessage = {
_id: message._id,
text: message.text,
createdAt: new Date(message.createdAt),
user: {
_id: message.user._id,
name: message.user.name,
},
};
loadedMessages.push(iMessage);
console.log('pushing into loadedMessages');
};
messagesRef.on('child_added', onReceive);
loadedMessages.sort(
(message1, message2) => message2.createdAt - message1.createdAt,
);
console.log(loadedMessages);
return () => {
console.log('useEffect Return:');
messagesRef.off();
};
}, []);
【问题讨论】:
-
你怎么知道所有的消息都收到了?是否有任何标志或参数表明已完成消息接收?比如消息的数量或任何事件。
-
@GaneshKarewad 我不确定。我认为 firebase 获取消息会自动停止,或者可能有一些 firebase 提供的指标,一旦完成这项工作,我就可以对数组进行排序。如果不是,那么在这里排序而不是在每次插入后排序更好的方法是什么?
-
而不是使用事件 child_added,你应该使用 value,它会给你一个项目列表而不是每次一个值,你可以对所有值进行排序。
-
@GaneshKarewad 我需要它在添加消息后继续更新,尽管有点像实时聊天更新。 “价值”是否适用于该用例?
标签: javascript react-native firebase-realtime-database react-hooks use-effect