如何在凤凰卫视频道正确使用休假/断开连接?

时间:2016-02-09 07:25:01

标签: websocket elixir phoenix-framework

我正在使用Phoenix频道将数据流式传输到带有选项卡式界面的页面。我想只在流媒体选项卡可见时从频道接收消息,并在用户切换到另一个标签时断开与频道的连接。

目前我使用类似于以下代码的内容:

window.websockets_url = "ws://localhost:4000/socket";
window.channel_id = "some-channel-id"


onWindowLoad = ->
  initSocket()

onStreamShow = ->
  connectToSocket()

onStreamHide = ->
  disconnectFromSocket()


initSocket = ->
  window.socket = new (Phoenix.Socket)(window.websockets_url)

connectToSocket = ->
  window.socket.connect()
  channel = window.socket.channel("channel:#{window.channel_id}", {})
  channel.join()
  channel.on "event", (payload) ->
    doSomethingWithThePayload(payload)

disconnectFromSocket = ->
  window.socket.disconnect()

这样可行,但多次调用connectToSocket()disconnectFromSocket()后,我在服务器日志中收到此消息:

  

StreamChannel收到主题为“channel:some-channel-id”的加入事件,但频道已加入

我该如何避免这种情况?

1 个答案:

答案 0 :(得分:2)

Javascript中的Phoenix Socket API是有状态的。断开连接后重新连接时,它将重新连接到之前的所有通道。您之后第二次加入该频道。

您可以重新初始化套接字(initSocket),也可以只在第一次连接时加入频道。