1

我正在尝试将消息添加到具有 rails 后端的 angular 应用程序中。为了让我的消息传递感觉“实时”,我使用 $interval 指令来调用我的服务器并每 5 秒获取两个用户之间的对话。我还使用 $watch 来查看我的消息,看看对象是否有变化,如果有,它将显示新的对话。

代码:

$scope.messages = messages.messages

getNewMessage = ->
 conversation.getConverationBetweenTwoUsers($stateParams.userId).then ((messages) ->
  $scope.messages = messages.messages
  ), (error) ->
  $state.reload()


checkForNewMessages = ->
  $interval(getNewMessage, 5000)

$scope.$watch('messages.messages', checkForNewMessages, true)

有人可以向我解释为什么我需要使用 websocket 而不是这种方法吗?另外,如果我正在做的是一个坏主意,您能否解释一下为什么以及什么是更好的方法。

请记住,我已经有用户进行对话,并且解决方案可以容纳我现有的对话。

4

1 回答 1

1

Websockets 允许它真正是实时的。您不必从客户端获取数据。Websockets 将打开服务器和客户端之间的连接,允许服务器在收到任何新数据后立即将其推送到客户端。

您只是在改变数据传输的方式。

使用 websockets,每当客户端生成新消息时,它都会被发送回服务器,服务器会侦听该新消息事件。然后,它通过向所有应接收该消息的客户端发出事件来中继该消息。

事件是被监听的并且可以携带有效载荷(即消息和用户信息)

示例:客户端 A:发出一个 'newMsg' 事件,有效负载为 '{user: user123, msg: my message, room: 512}' 服务器正在侦听 'newMsg' 事件。在“newMsg”事件中,服务器将该有效负载作为事件发出,可能类似于:socket.emit('512', '{user: 1234, msg: my message}')

现在,任何连接到服务器并侦听“512”事件的客户端都将收到该消息。当服务器中继消息时,您也可以添加任何类型的数据库事务,以捕获对话。

我不能专门与 Rails 交谈,但套接字侦听器的设置很简单——您只需创建一个侦听器函数并为其分配一个特定的事件。当该事件被触发时,您将运行您需要的任何逻辑。无需获取数据并检查更改。

就像是:

socket.on('myEvent', function(data) {
    //do some cool data stuff
})
于 2015-04-26T04:40:32.057 回答