【问题标题】:Is there a way to get presences list inside a controller?有没有办法在控制器内获取存在列表?
【发布时间】:2019-06-05 11:59:00
【问题描述】:

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

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

【问题讨论】:

    标签: elixir phoenix-framework phoenix-channels


    【解决方案1】:

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

    有参考:Phoenix.Presence.list

    【讨论】:

      【解决方案2】:

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

      假设这是控制器操作

          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)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 2016-09-17
        • 1970-01-01
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多