Есть ли способ получить список присутствия внутри контроллера?
Я пытаюсь получить список присутствия внутри контроллера Phoenix, но мне нужен сокет, чтобы использовать функцию Presence.list(socket)
,
Кто-нибудь знает, как использовать Presence.list(socket)
внутри контроллера? Причина, по которой я пытаюсь это сделать, заключается в том, что я хочу найти в моей базе данных другого пользователя, нежели те, которые подключены к каналу (список присутствия).
2 ответа
Лучший способ, который я нашел, был: Phoenix.Presence.list(MyApp.MyChannel, "my_topic")
Есть ссылка: Phoenix.Presence.list
Почему бы вам не задать канал вместо этого, просто создать синхронную задачу, объединить задачу в группу, в которую вы ожидаете получить результат, затем отправить сообщение на канал и затем вернуть результат обратно в контроллер в качестве результата завершения задачи.
Допустим, это действие контроллера
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)
Это должно быть более чистым способом вместо того, чтобы влиться во внутренние органы присутствия, которые могут измениться в будущем.
Второй вариант - создать собственный трекер и подключить его к приложению, а затем попросить трекер предоставить вам список существующих пользователей для определенного канала. Вы можете найти некоторые детали, как реализовать поведение трекера здесь