在使用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请求可能会在文章完全完成之前返回数据。
因此,我试图弄清楚如何设置回调,这样当POST成功地添加到集合时,就可以获得GET。如果我想办法的话,我会分享这个解决方案的。
发布于 2014-03-28 03:57:55
您没有显示socket.io客户端代码,但我认为第二种方法更好。套接字只应发送/接收数据。我假设您的套接字中至少有一个事件是"receiveMessage“的,而一个事件是"sendMessage”的。
我想你可以,在你的客户端套接字上:
如果您使用的是Marionette视图,永远不要用jQuery在视图的HTML中添加一些东西!)
对于初始消息加载,第一次使用Collection.fetch() (例如,一旦连接套接字)来获取服务器上已经存在的所有消息。从那时起,在消息出现时添加单独的消息,而不是全部获取它们(您将保存bandwith)。
在类似的应用程序中,我所做的是在第一个连接时从套接字发送一个"Hello“消息,其中包括我需要的数据。然后,我只使用从套接字发送的内容来处理Collection.reset(数据),这样就可以了。套接字将初始化集合并每次更新一条消息。
希望能帮上忙!
https://stackoverflow.com/questions/22676996
复制相似问题