Backbone.js只发送一次GET请求?
问题描述:
socket.on('new message', function(data) {
self.createMessage(data);
});
createMessage: function(data) {
setTimeout(function() {
window.App.data.messages.fetch({
success: function() {
console.log('success')
}
});
}, 1000);
window.App.core.vent.trigger('app:log', 'Chat View: Received a new message!');
}
比方说,例如我有三个插座/用户连接。当我运行上面的代码时,每个客户端都会使该GET请求三次(连接的用户数量很多)。有点烦我,它运作良好,但我不喜欢不必要的要求。Backbone.js只发送一次GET请求?
这有点令人困惑,因为如果我只是附加一些这样的HTML。
createMessage: function(data) {
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!');
}
那么,所有连接的套接字/用户只发生一次而不是三次?但是当我获取GET时,它希望提出三次请求,嗯?任何想法,我错过了什么?
全码:所以没有混乱
var Marionette = require('backbone.marionette'),
MessagesView = require('./messages'),
socket = io.connect();
module.exports = ChatView = Marionette.ItemView.extend({
className: 'chat',
template: require('../../templates/chat.hbs'),
events: {
'submit #chat-form': 'sendMessage'
},
initialize: function() {
var self = this;
this.messagesView = new MessagesView({ collection: window.App.data.messages });
socket.on('new message', function(data) {
self.createMessage(data);
});
},
onRender: function() {
this.$el.find('.message-content').append(this.messagesView.render().$el);
},
sendMessage: function(e) {
e.preventDefault();
var $message = this.$el.find('input.message');
$email = this.$el.parent().attr('data-email');
$username = this.$el.parent().attr('data-username');
var message = {
email : $email,
username: $username,
message : $message.val()
}
if($message.val() != '') {
socket.emit('send message', $message.val());
window.App.data.messages.create(message);
$message.val('');
}
window.App.core.vent.trigger('app:log', 'Chat View: Sent a new message!');
},
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!');
}
});
答
所以socket.io和Backbone.js的组合似乎并不流行。这是惊人的技术海事组织。
好吧,于是我找到了一个解决方案,我忘记了,而.fetch
使得我的GET请求,.create
发出POST请求。
所以,通过简单地将回调加回.create
方法,然后成功,我将数据发送到套接字,然后将其返回给客户端,并向所有套接字发出GET请求。像魅力一样工作,这是我的解决方案。
var Marionette = require('backbone.marionette'),
MessagesView = require('./messages'),
socket = io.connect();
module.exports = ChatView = Marionette.ItemView.extend({
className: 'chat',
template: require('../../templates/chat.hbs'),
events: {
'submit #chat-form': 'sendMessage'
},
initialize: function() {
var self = this;
this.messagesView = new MessagesView({ collection: window.App.data.messages });
socket.on('new message', function(data) {
self.createMessage(data);
});
},
onRender: function() {
this.$el.find('.message-content').append(this.messagesView.render().$el);
},
sendMessage: function(e) {
e.preventDefault();
var $message = this.$el.find('input.message');
$email = this.$el.parent().attr('data-email');
$username = this.$el.parent().attr('data-username');
var message = {
email : $email,
username: $username,
message : $message.val()
}
if($message.val() != '') {
//window.App.data.messages.create(message);
window.App.data.messages.create({ message }, {
success: function() {
socket.emit('send message', $message.val());
}
});
$message.val('');
}
window.App.core.vent.trigger('app:log', 'Chat View: Sent a new message!');
},
createMessage: function(data) {
window.App.data.messages.fetch({
success: function() {
console.log('success')
}
});
window.App.core.vent.trigger('app:log', 'Chat View: Received a new message!');
}
});
这解决了我所有的问题。对于我来说,在数据在服务器上成功运行之前,我不会进行排放或任何GET请求。然后在成功之后,我发出数据,然后.fetch()
方法只对每个套接字运行一次!
一定不要成为热门话题lol –
我在这里没有看到任何GET请求,但是您可能正在复制您的听众。 – Houseman
那么'.fetch'方法会发出GET请求。我找到了一个解决方案:)我在这里分享一秒! –