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!'); 
    } 

}); 
+0

一定不要成为热门话题lol –

+0

我在这里没有看到任何GET请求,但是您可能正在复制您的听众。 – Houseman

+0

那么'.fetch'方法会发出GET请求。我找到了一个解决方案:)我在这里分享一秒! –

所以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()方法只对每个套接字运行一次!