有没有办法在控制器中获取存在列表?
Is there a way to get presences list inside a controller?
我正在尝试获取 phoenix 控制器中的存在列表,但我需要套接字才能使用函数 Presence.list(socket)
。
有人知道如何在控制器中使用 Presence.list(socket)
吗?
我尝试这样做的原因是我想在我的数据库中找到与连接到频道(存在列表)的用户不同的用户。
你为什么不问通道,只是产生同步任务,将任务加入到你希望收到结果的组,然后将消息推送到通道,然后 return 结果返回控制器作为任务完成结果。
假设这是控制器操作
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
然后在频道中只处理广播和return Presence.list(socket)
这应该是一种更简洁的方式,而不是贬低未来可能会改变的存在内部结构。
第二种选择是创建您自己的跟踪器并将其插入应用程序,然后要求您的跟踪器为您提供特定频道的现有用户列表。您可以找到一些有关如何实现跟踪器行为的详细信息 here
我找到的最佳方法是:Phoenix.Presence.list(MyApp.MyChannel, "my_topic")
我正在尝试获取 phoenix 控制器中的存在列表,但我需要套接字才能使用函数 Presence.list(socket)
。
有人知道如何在控制器中使用 Presence.list(socket)
吗?
我尝试这样做的原因是我想在我的数据库中找到与连接到频道(存在列表)的用户不同的用户。
你为什么不问通道,只是产生同步任务,将任务加入到你希望收到结果的组,然后将消息推送到通道,然后 return 结果返回控制器作为任务完成结果。
假设这是控制器操作
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
然后在频道中只处理广播和return Presence.list(socket)
这应该是一种更简洁的方式,而不是贬低未来可能会改变的存在内部结构。
第二种选择是创建您自己的跟踪器并将其插入应用程序,然后要求您的跟踪器为您提供特定频道的现有用户列表。您可以找到一些有关如何实现跟踪器行为的详细信息 here
我找到的最佳方法是:Phoenix.Presence.list(MyApp.MyChannel, "my_topic")