Elixir 如何使用phoenix向一个套接字_id广播
在文档中有此示例,但它仅适用于断开连接Elixir 如何使用phoenix向一个套接字_id广播,elixir,phoenix-framework,phoenix-channels,Elixir,Phoenix Framework,Phoenix Channels,在文档中有此示例,但它仅适用于断开连接 使用Phoenix.Socket 频道“房间:”,MyAppWeb.RoomChannel def connect(参数、套接字、连接信息)do {:好的,分配(套接字,:user_id,params[“user_id”])} 结束 def id(socket),do:“users_socket:#{socket.assigns.user_id}” 结束 #断开所有用户的套接字连接及其多路复用通道 MyAppWeb.Endpoint.broadcast(“
使用Phoenix.Socket
频道“房间:”,MyAppWeb.RoomChannel
def connect(参数、套接字、连接信息)do
{:好的,分配(套接字,:user_id,params[“user_id”])}
结束
def id(socket),do:“users_socket:#{socket.assigns.user_id}”
结束
#断开所有用户的套接字连接及其多路复用通道
MyAppWeb.Endpoint.broadcast(“users\u socket:user.id,“disconnect”,%{})
我已经试过了,它只适用于断开连接
我在一些地方读到过,你可以为那个用户创建一个特定的主题,但我可以用一个实际的例子。我在探索复杂性方面有困难,可以用一个实际的例子
多谢各位
我在想,如果你能在ets表中获得底层套接字,你只需将/4推到该套接字,但我不知道如何操作。你需要订阅一个主题才能接收广播 “断开连接”消息很特殊,因为它不需要订阅 在
Phoenix.Socket
源代码中,存在以下三行代码:
def __info__(%Broadcast{event: "disconnect"}, state) do
{:stop, {:shutdown, :disconnected}, state}
end
这也是接收到“断开连接”广播时套接字状态改变的原因
“回退”功能如下所示:
def __info__(_, state) do
{:ok, state}
end
socket.endpoint.subscribe("some_topic:" <> socket.assigns.user_id)
MyAppWeb.Endpoint.broadcast("some_topic:" <> user.id, "some_event", %{foo: bar})
@impl true
def handle_info(%{event: "some_event"} = info, socket) do
IO.inspect info, label: "INFO"
{:noreply, socket}
end
这意味着对于任何和所有“其他”主题,套接字状态保持不变
您需要手动订阅“其他”主题
它应该是这样的:
def __info__(_, state) do
{:ok, state}
end
socket.endpoint.subscribe("some_topic:" <> socket.assigns.user_id)
MyAppWeb.Endpoint.broadcast("some_topic:" <> user.id, "some_event", %{foo: bar})
@impl true
def handle_info(%{event: "some_event"} = info, socket) do
IO.inspect info, label: "INFO"
{:noreply, socket}
end
好的,到目前为止还不错(我也没有使用LV fwiw),但是。。。def handle_info(%%{event:event,payload:payload}=info,socket)do push(socket,event,payload){noreply,socket}end似乎没有将事件推送到前端。我假设这就是我应该如何将事件推送到FE的方式?您是否在前端的Javascript中使用套接字?这里有一些使用socket.js的好例子:我认为应该使用
broadcast
将事件发送到Javascript。broadcast将事件发送给所有不同的用户!我给他们提供了unqiue用户ID也是的,我正在使用phoenix提供的socket.js并处理其他socket事件。Sok,我认为你根本不应该有handle_info这个东西。您只需要连接到javascript中的一个频道,然后推到该频道。请参阅这些文档:您只需阅读前几个部分。对不起,我把你引入歧途了,我以为你在用LV。