Phoenix:如何在通道中的套接字上存储共享状态?

时间:2017-02-17 13:33:20

标签: elixir phoenix-framework

我有一个2人聊天的应用。但在他们聊天之前,两方都必须按下"接受"

前端的

我有一个调用此功能的按钮:

overflow:hidden

在我的凤凰频道我有这个(这是不完整的,因为我不知道该怎么做):

function acceptMatch() {
  channel.push("accept_match", {
    "matched_client_email": matchedClientEmail,
  });
}

我查看 def handle_in("accept_match", %{ "matched_client_email" => matched_client_email }, socket) do Logger.info "accept_match" ... ############################### here #################################### match_accepted = true # <-- I want to be able to find out if the other person has pressed "accept" as well case match_accepted do true -> ... {:noreply, socket} _ -> {:noreply, socket} end end ,但这似乎与PID有关,我不能轻易地传递到不同的套接字。我试图在所有可以保存到/查询的连接之间寻找一个公共存储(数据库除外)。这样,如果甲方按下接受,我可以询问存储&#34;乙方接受了吗?&#34;

=== UPDATE ===

当我尝试使用命名代理时,我得到了这个:

Agent

1 个答案:

答案 0 :(得分:2)

实际上,您似乎可以在connect user_socket这个特定的PID或代理名称中传递给Agent.start_link(your_func, name: :myagent) 中的每个新连接,它应该解决这种情况。您只需要一个代理,因此您可以为其命名,例如

Agent.get(:myagent, your_get_func)

后来从中获取

lib

您也可以考虑使用Registry,它来自标准库中的Elixir 1.4。

此代理可以在<app_name>.ex中,您只需将其作为单个工作人员添加到function initMap() { var mapDiv = document.getElementById('map'); var map = new google.maps.Map(mapDiv, {center: {lat: 45.9, lng: 25.0}, zoom:7, mapTypeId: google.maps.MapTypeId.ROADMAP, disableDoubleClickZoom:true, scrollwheel:false, ...}); var marker = new google.maps.Marker({position: {lat:46.1, lng:25.4}, map:map, icon:'../images/Marker.png}); } 文件中,并在需要时使用专用主管进行监督。