Есть ли способ получить список присутствия внутри контроллера?

Я пытаюсь получить список присутствия внутри контроллера 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)

Это должно быть более чистым способом вместо того, чтобы влиться во внутренние органы присутствия, которые могут измениться в будущем.

Второй вариант - создать собственный трекер и подключить его к приложению, а затем попросить трекер предоставить вам список существующих пользователей для определенного канала. Вы можете найти некоторые детали, как реализовать поведение трекера здесь

Другие вопросы по тегам