2017-02-17 7 views
1

私は2人の人がチャットするアプリを持っています。しかし、彼らはチャットする前に、両当事者は、フロントエンドに押しPhoenix:チャネル内のソケット間で状態共有を保存するにはどうすればいいですか?

を「受け入れる」する必要があり、私はこの関数を呼び出すボタンがあります。私の鳳凰チャンネルで

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

を私は(これを持っているので、I不完全です「)何をすべきか分からない:

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 

私はAgentに見えたが、それは私が簡単に別のソケットに周りに渡すことができないだろうPID、に結び付けているように見えます。私は/クエリに保存することができますすべての接続の間に共通のストレージ(データベース以外)を探しています。このようにしてパーティAが受け入れるならば、私はストレージに "パーティBが受け入れましたか?"と尋ねることができます。

=== UPDATE ===

私は名前のエージェントを使用してみたとき、私はこの取得:

iex(11)> myfunc = fn -> %{} end 
#Function<20.52032458/0 in :erl_eval.expr/5> 
iex(12)> Agent.start_link(myfunc, name: "Cool") 
** (CaseClauseError) no case clause matching: {"Cool", []} 
    (elixir) lib/gen_server.ex:544: GenServer.do_start/4 
iex(12)> 

答えて

2

を実際に、あなたがあなたのuser_socketこの中でconnectの各新しい接続に渡すかもしれないようですエージェントの特定のPIDまたは名前であり、このケースを解決するはずです。エージェントは1つだけ必要なので、名前を付けることができます。

Agent.start_link(your_func, name: :myagent) 

以降

Agent.get(:myagent, your_get_func) 

また、あなたが標準ライブラリにエリクシール1.4からである、Registryを使用することを検討することができ、そこから取得します。

このエージェントはlibにある可能性があります。このエージェントを単一のワーカーとして<app_name>.exファイルに追加し、必要に応じて専用のスーパーバイザで監視することができます。

+0

涼しい!私はそれをやろうとしたときにエラーが発生しました...エラーで私の質問を更新しました – Edmund

+0

原子のときに動作するように見えます! 'name::cool' – Edmund

+0

はい、申し訳ありません。私は自分の答えを更新しました。名前はhttps://hexdocs.pm/elixir/GenServer.html#module-name-registrationの要件を満たす必要があります – PatNowak

関連する問題