Javascript Firebase push()方法洗牌列表数据

Javascript Firebase push()方法洗牌列表数据,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我们创建了一个聊天应用程序,并使用firebase进行实时通信。 有时我注意到push()方法会洗牌列表数据。我们可以在下图中看到: 如果我们在上图中看到,我只是想和某人交流,我说了你好,用户回答说嘿,我再次说我需要一些帮助,然后用户说,这就是我来这里的目的。我能为您提供什么帮助?在回复中,但如果我们在图像中看到用户回复首先出现 这是断断续续发生的,这就是为什么我没有解决这个问题。所以请有人帮我解决我做错了什么 var pushMessageToFB = function(){ var cha

我们创建了一个聊天应用程序,并使用firebase进行实时通信。 有时我注意到push()方法会洗牌列表数据。我们可以在下图中看到:

如果我们在上图中看到,我只是想和某人交流,我说了你好,用户回答说,我再次说我需要一些帮助,然后用户说,这就是我来这里的目的。我能为您提供什么帮助?在回复中,但如果我们在图像中看到用户回复首先出现

这是断断续续发生的,这就是为什么我没有解决这个问题。所以请有人帮我解决我做错了什么

var pushMessageToFB = function(){
var chatMsgRef = db.child("chatMessages").child("gr1").child("ch_usr1_usr2");
var message = {
    type: "chat",
    content: data.messageText,
    timestamp: Date.now(),
    by: user.id
};
chatMsgRef.push(message, function(err){
    if (err){
        console.log('error occurred while pushing message to fb : err ' + JSON.stringify(err));
    }
});};
var loadChatMessages = function(){
var chatMsgRef = db.child('chatMessages').child("gr1").child("ch_usr1_usr2");
$scope.chatMessages = chatMsgRef.orderByKey().limitToLast(50);  

})

不要将日期用于远程数据。每台机器上的日期都会略微偏移。写入数据时,哪个Firebase将转换为服务器的Unix纪元时间。这确保了客户之间订单的一致性


您没有提供任何关于如何阅读或显示聊天信息的代码,但由于您试图按时间顺序显示聊天信息,因此我假设您的查询使用
orderBy(“timestamp”)
。如果在编写消息时使用
ServerValue.TIMESTAMP
,将保证按照写入数据库的顺序进行排序。

不要对远程数据使用日期。在每台机器上都会略微偏移。写入数据时,哪个Firebase将转换为服务器的Unix纪元时间。这确保了客户之间订单的一致性


您没有提供任何关于如何阅读或显示聊天信息的代码,但由于您试图按时间顺序显示聊天信息,因此我假设您的查询使用
orderBy(“timestamp”)
。如果在编写消息时使用
ServerValue.TIMESTAMP
,将保证按照写入数据库的顺序进行排序。

请提供相关的代码和数据结构,否则没有什么可诊断的。特别是您如何编写、查询和显示回复。嗨,Travis Christian…正如我之前所说,有时会发生这种情况,这就是为什么我无法解决这个问题的原因。请提供您的相关代码和数据结构,否则没有什么可诊断的。具体地说,你是如何写、查询和显示回复的。嗨,特拉维斯·克里斯蒂安……正如我之前所说的,这种情况有时并不经常发生,这就是为什么我不能像听起来那么疯狂地解决这个问题的原因,我也不会使用时间戳。在Firetalk,我们(我)看到了一两个时间戳可能相互交叉的大容量实时聊天案例。这似乎不太可能,但绝对不是不可能。Firebase的自动发电机ID通常是这里排序的最佳选项。它是专门为此设计的。嗨,查德·罗宾逊,我使用orderByKey()。下面是代码var loadChatMessages=function(){var chatMsgRef=db.child('chatMessages').child('gr1”).child('ch_usr1_usr2');$scope.chatMessages=chatMsgRef.orderByKey().limitToLast(50);}@ChadRobinson对此表示感谢,我不确定按键在语义上是否严格按时间顺序排列,因为我的数据库中有一些旧项,尽管字母数字较少,但它们显示在集合的底部。这只是SDK升级的产物吗?@GauravPriyadarshi如果这不能解决您的问题,请包含相关代码和数据样本。@TravisChristian Firebase文档在处理数据推送列表时说:
()确保了一个唯一且按时间顺序排列的键。
抱歉,我对旧版本的SDK没有太多经验,这可能是真的,但至少对于最新的实现,这是他们的官方立场。听起来很疯狂,我也不会使用时间戳。在Firetalk,我们(我)看到了一两个时间戳可能相互交叉的大容量实时聊天案例。这似乎不太可能,但绝对不是不可能。Firebase的自动发电机ID通常是这里排序的最佳选项。它是专门为此设计的。嗨,查德·罗宾逊,我使用orderByKey()。下面是代码var loadChatMessages=function(){var chatMsgRef=db.child('chatMessages').child('gr1”).child('ch_usr1_usr2');$scope.chatMessages=chatMsgRef.orderByKey().limitToLast(50);}@ChadRobinson对此表示感谢,我不确定按键在语义上是否严格按时间顺序排列,因为我的数据库中有一些旧项,尽管字母数字较少,但它们显示在集合的底部。这只是SDK升级的产物吗?@GauravPriyadarshi如果这不能解决您的问题,请包含相关代码和数据样本。@TravisChristian Firebase文档在处理数据推送列表时说:
()确保了一个唯一且按时间顺序排列的键。
抱歉,我对旧版本的SDK没有太多经验,这可能是真的,但至少对于最新的实现,这是他们的官方立场。