有没有一种方法可以获取控制器内部的状态列表?

时间:2019-01-10 15:14:00

标签: elixir phoenix-framework phoenix-channels

我试图在phoenix控制器中获取状态列表,但是我需要使用套接字来使用功能Presence.list(socket)

任何人都知道如何在控制器内部使用Presence.list(socket)吗? 我尝试执行此操作的原因是,我想在数据库中找到与连接到通道(状态列表)的用户不同的用户。

2 个答案:

答案 0 :(得分:1)

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

有参考文献:Phoenix.Presence.list

答案 1 :(得分:0)

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

让我们说这是控制器动作

/**
 * Generate our possible error scores
 */
function generateErrorScores() {
  const multiplier = 0.5
  return [...Array((100 / multiplier) + 1)].map((x, i) => i * multiplier)
}

console.log(generateErrorScores())

然后进入频道仅处理广播并返回 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

这应该是一种更清洁的方法,而不是设计将来可能会更改的状态内部。

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

的详细信息