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。