1

我正在尝试在 phoenix 控制器中获取存在列表,但我需要套接字才能使用该功能Presence.list(socket)

有人知道如何Presence.list(socket)在控制器内部使用吗?我尝试这样做的原因是我想在我的数据库中找到与连接到频道(存在列表)的用户不同的用户。

4

2 回答 2

1

我发现的最好方法是:Phoenix.Presence.list(MyApp.MyChannel, "my_topic")

有参考:Phoenix.Presence.list

于 2019-01-15T17:25:24.230 回答
0

你为什么不问通道,只是产生同步任务,将任务加入你希望接收结果的组,然后将消息推送到通道,然后将结果作为任务完成结果返回给控制器。

假设这是控制器动作

    defmodule SomeController do
      #...
      def some_action(conn, params) do
        task = Task.async(fn ->
          MyApp.Endpoint.subscribe("topic:123:presence_list")
          MyApp.Endpoint.broadcast("topic:123", :presence_list, %{})
          receive do
            {:presence_list, list} ->
              {:ok, list}
          after
            5000 ->
              {:error, timeout}
          end
        end)
        {:ok, list} = Task.await(task)
        # do something with a list
      end
    end

然后在频道中处理广播并返回Presence.list(socket)

这应该是更清洁的方式,而不是屈从于未来可能会改变的存在内部。

第二种选择是创建您自己的跟踪器并将其插入应用程序,然后要求您的跟踪器为您提供特定频道的当前用户列表。您可以在此处找到一些如何实现跟踪器行为的详细信息

于 2019-01-10T15:50:04.797 回答