我跟随着PragProg" Programming Phoenix"我现在正在关于凤凰卫视频道的章节。
在某些时候,有一个关于设置一个主题的简单频道以及在客户端和服务器之间处理/输出消息的示例。没有花哨的东西,一切都像宣传的一样。
然后我开始调查Phoenix.Channel的API并找到" broadcast_from"功能
做了一些研究,我很清楚使用" broadcast_from" (来自频道)会将消息发送给所有连接的客户端,但是我正在处理其消息的客户端。
我目前的代码是
defmodule Rumbl.VideoChannel do
use Rumbl.Web, :channel
def join("videos:" <> video_id, _params, socket) do
:timer.send_interval(5000, :ping)
{:ok, %{status: "successful join"}, assign(socket, :video_id, String.to_integer(video_id))}
end
def handle_info(:ping, socket) do
count = socket.assigns[:count] || 1
#push socket, "ping", %{count: count}
broadcast_from! socket, "test", %{id: 1, status: :critical}
{:noreply, assign(socket, :count, count + 1)}
end
end
我预计,在客户端连接时,客户端将无法接收 &#34;测试&#34;消息。这确实是结果。直到我打开另一个浏览器窗口并连接到该频道。在那时候 两个窗口都开始接收&#34;测试&#34;消息。如果从另一台设备(例如iPhone)打开第二个窗口,也会发生这种情况。
这是正常行为还是我误用/误解了文档?
提前感谢您的支持。
答案 0 :(得分:0)
我认为,这是正常行为。来自broadcast_from纪录片:
拥有套接字的频道将不会收到已发布的消息。
有点令人困惑。据我所知,当您打开另一个窗口时,join
会创建另一个套接字,从而创建另一个pid,您可以在第一个窗口中收到测试消息。只有一个窗口,您将看不到测试消息。使用两个窗口,您将看到每个来自两个套接字的另一个pid的测试消息。