Есть ли способ получить список присутствия внутри контроллера? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь получить список присутствия внутри контроллера феникса, но мне нужен сокет для использования функции Presence.list(socket).

Кто-нибудь знает, как использовать Presence.list(socket) внутри контроллера? Причина, по которой я пытаюсь это сделать, заключается в том, что я хочу найти в базе данных другого пользователя, нежели те, которые подключены к каналу (список присутствия).

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Лучший способ, который я нашел, был: Phoenix.Presence.list(MyApp.MyChannel, "my_topic")

Есть ссылка: Phoenix.Presence.list

0 голосов
/ 10 января 2019

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

Допустим, это действие контроллера

    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)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...