使用socket.io处理具有实时消息的应用程序时,我还需要保存消息。我选择使用mongodb,在客户端我使用骨干。
我的问题是,当我发出新消息时,所有套接字/用户实时获取消息,但发送消息的套接字/用户从套接字获取两次,一次从集合重新呈现。
以下是我的收藏夹视图。
module.exports = CollectionView = Marionette.CollectionView.extend({
className: 'collection',
initialize: function() {
//this.listenTo(this.collection, 'change', this.render);
},
itemView: MessageView
});
我评论了this.listenTo(this.collection, 'change', this.render);
。所以我问这个问题,因为默认情况下牵线木偶可以渲染CollectionView吗?也许某人有一个解释我如何阻止发送消息的套接字/用户被附加两次?
编辑刚刚有了一个想法,而不是附加消息,我可以在新消息发送时获取该集合?我试过它并且它有效,也许有更好的方法?我还在想,并且愿意接受新想法!
编辑:这对我来说效果很好。我只是向连接的所有套接字发出GET请求,而不是附加html,这样他们就可以获得新数据。
createMessage: function(data) {
window.App.data.messages.fetch({
success: function() {
console.log('success')
}
});
//this.$el.find('.message-content').append('<div class="message"><b>'+data.username+':</b>'+data.message+'</div>');
window.App.core.vent.trigger('app:log', 'Chat View: Received a new message!');
}
只有上面的问题是序列是POST,然后GET在彼此的毫秒之内,所以GET请求可能在POST完全结束之前返回数据。
所以我试图找出如何设置回调,以便在POST成功添加到集合时进行GET。如果我来的话,我会分享解决方案。
答案 0 :(得分:1)
您没有显示您的socket.io客户端代码,但我认为您的第二种方法更好。套接字应该只发送/接收数据。我假设您的套接字中至少有一个事件是&#34; receiveMessage&#34;和1发出&#34; sendMessage&#34;。
我认为你可以在你的客户端套接字中:
收到邮件时(或我收到通知我有新邮件),请使用Collection.add(邮件)将邮件添加到您的收藏中。木偶将为你呈现这条信息。
发送邮件时,只需将其添加到您的收藏中,或等待来自服务器的回调(请参阅文档)以确保在添加到收藏集之前已正确收到该邮件。
如果你正在使用Marionette视图,那么永远不要用jQuery在视图的HTML上添加一些内容! ;)
对于初始消息加载,首次使用Collection.fetch()(例如,一旦连接套接字),就可以获取服务器上已有的所有消息。从那时起,添加单个消息而不是全部取消(您将保存带宽)。
我在类似的应用程序中所做的是从套接字a&#34; Hello&#34;第一次连接时的消息,包括我需要的数据。然后我只使用从套接字发送的内容进行Collection.reset(数据),你就可以了。您的套接字将初始化您的集合,并将一次更新一条消息。
希望它有所帮助!