我有一个聊天应用程序,双方在进入聊天之前必须按“接受”。序列如下:Elixir + Phoenix:如何将代理商作为商店使用?
- 甲方加入该渠道。
Agent
将start_link
与派对 A的电子邮件地址作为密钥 - 乙方加入渠道。
Agent
将start_link
与乙方的电子邮件地址作为密钥 - 甲方 按接受。若B还没有接受(代理,
Agent
将存储Party A's email -> Party B's email -> true
,否则将消息发送到 A方也接受乙方。 - 乙方印刷机接受。 如果A还没有接受,
Agent
将存储Party A's email -> Party B's email -> true
,否则将消息发送给甲方乙方 也接受了。
我遇到一个错误,现在它似乎并不像
2017-03-01T14:02:40.434791+00:00 app[web.1]: 14:02:40.433 [error] GenServer #PID<0.1743.0> terminating
2017-03-01T14:02:40.434793+00:00 app[web.1]: ** (stop) exited in: GenServer.call(:"[email protected]", {:get, #Function<1.108716101/1 in VideoChat.CallChannel.handle_in/3>}, 5000)
2017-03-01T14:02:40.434794+00:00 app[web.1]: ** (EXIT) no process
2017-03-01T14:02:40.434795+00:00 app[web.1]: (elixir) lib/gen_server.ex:596: GenServer.call/3
2017-03-01T14:02:40.434795+00:00 app[web.1]: (video_chat) web/channels/call_channel.ex:152: VideoChat.CallChannel.handle_in/3
2017-03-01T14:02:40.434796+00:00 app[web.1]: (phoenix) lib/phoenix/channel/server.ex:226: anonymous fn/4 in Phoenix.Channel.Server.handle_info/2
2017-03-01T14:02:40.434797+00:00 app[web.1]: (stdlib) gen_server.erl:615: :gen_server.try_dispatch/4
2017-03-01T14:02:40.434798+00:00 app[web.1]: (stdlib) gen_server.erl:681: :gen_server.handle_msg/5
2017-03-01T14:02:40.434798+00:00 app[web.1]: (stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
这是我的频道:
def join("user_pool:" <> email, %{ "app" => app }, socket) do
Logger.info "PRODUCTION user_pool email: #{email}, app: #{app}"
socket = assign(socket, :email, email)
socket = assign(socket, :app, app)
Agent.start_link(fn -> %{} end, name: :"#{email}") # <---------------- should start link here
{:ok, socket}
end
def handle_in("approve_match", %{ "matched_client_email" => matched_client_email }, socket) do
Logger.info "approve_match"
current_user_email = socket.assigns[:email]
Agent.update :"#{current_user_email}", fn state ->
Map.put(state, matched_client_email, true)
end
match_accepted = Agent.get(:"#{matched_client_email}", &(Map.get(&1, current_user_email))) # <----------- breaks here. this is line 152
Logger.info "#{matched_client_email} has approved #{current_user_email}: #{match_accepted}"
case match_accepted do
true ->
VideoChat.Endpoint.broadcast(
"user_pool:#{matched_client_email}",
"match_accepted",
%{ matched_client_email: socket.assigns[:email] }
)
{:noreply, socket}
_ ->
Logger.info "2nd person has yet to approve"
{:noreply, socket}
end
end
它似乎没有打破,当我在控制台中运行测试线:
iex(20)> Agent.start_link(fn -> %{} end, name: :"blah")
{:ok, #PID<0.365.0>}
iex(21)> Agent.get(:"blah", &(Map.get(&1, "sdfs")))
nil
我只是用Agent
不正确?
您也可能应该修改标题,因为'Agent'只能用作商店。现在这听起来有点同义反应。 – mudasobwa