我需要在用户离开频道时执行一些操作(在大多数情况下,他们会自愿关闭选项卡,但可能还会出现连接丢失/超时等情况)
根据诸如https://elixirforum.com/t/phoenix-presence-run-some-code-when-user-leaves-the-channel/17739和How to detect if a user left a Phoenix channel due to a network disconnect?之类的帖子,拦截来自"presence_diff"
的{{1}}事件似乎是一种万无一失的方法,因为它还应涵盖以下情况:连接异常终止。
奇怪的是,Presence
事件似乎仅在我通过presence_diff
跟踪用户时才触发,而在用户离开时却没有触发。
同时,在我的频道中添加一个Presence.track
回调会正确地捕获请假事件。
我想知道我的配置有什么问题。还是我不正确理解在线状态的使用?
示例代码:
terminate(reason, socket)
答案 0 :(得分:0)
好的,我想我知道发生了什么:顾名思义,每个"participant:" <> participant_id
主题仅由一个参与者订阅。因此,当该参与者退出时,该过程也将消失,并且任何人都无法对presence_diff
消息采取行动。
仍然需要一个单独的过程。可以从该过程中调用MyApp.Endpoint.subscribe
来订阅"participant:" <> participant_id
主题并根据presence_diff
消息采取行动。
或者可以设置一台外接显示器。参见How to detect if a user left a Phoenix channel due to a network disconnect?