如何在凤凰频道正确使用leave/disconnect?
How to properly use leave/disconnect in Phoenix channels?
我正在使用 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 received join event with topic "channel:some-channel-id" but channel already joined
我怎样才能避免这种情况?
Javascript 中的 Phoenix Socket API 是有状态的。当您在断开连接后重新连接时,它将重新连接到之前的所有频道。然后您将第二次加入该频道。
您可以重新初始化套接字 (initSocket) 或仅在第一次连接时加入频道。
我正在使用 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 received join event with topic "channel:some-channel-id" but channel already joined
我怎样才能避免这种情况?
Javascript 中的 Phoenix Socket API 是有状态的。当您在断开连接后重新连接时,它将重新连接到之前的所有频道。然后您将第二次加入该频道。
您可以重新初始化套接字 (initSocket) 或仅在第一次连接时加入频道。