2016-08-31 8 views
0

私はPragProg "Programming Phoenix"の本に従っていますが、現在Phoenixのチャンネルについての章があります。Phoenix 1.2 - broadcast_from説明が必要

ある時点では、1つのトピックで単純なチャネルを設定し、クライアントとサーバー間のイン/アウトメッセージを処理する例があります。空想的なものはなく、広告されたようにすべてが機能しました。

その後、私はPhoenix.ChannelのAPIを調査し始め、 "broadcast_from"機能を発見しました。

「broadcast_from」(チャンネルから)を使用すると、接続されているすべてのクライアントにメッセージが送信されていましたが、現在メッセージが処理されていたことがわかりました。

私の現在のコードは、私は、クライアントの接続時に、クライアントは 「テスト」のメッセージを受信しないだろう、という期待

defmodule Rumbl.VideoChannel do 
    use Rumbl.Web, :channel 

    def join("videos:" <> video_id, _params, socket) do 
    :timer.send_interval(5000, :ping) 
    {:ok, %{status: "successful join"}, assign(socket, :video_id, String.to_integer(video_id))} 

    end 

    def handle_info(:ping, socket) do 
    count = socket.assigns[:count] || 1 
    #push socket, "ping", %{count: count} 
    broadcast_from! socket, "test", %{id: 1, status: :critical} 
    {:noreply, assign(socket, :count, count + 1)} 
    end 

end 

です。そして、それは確かに結果でした。別のブラウザウィンドウを開いてチャンネルに接続するまでその時点で、 両方のウィンドウが「テスト」メッセージを受信し始めました。 2番目のウィンドウが別のデバイス(iPhoneなど)から開かれた場合も同様です。

これは正常な動作か、ドキュメントを誤解したり誤解したりしていますか?

ご協力いただきありがとうございます。

答えて

0

私はこれが正常な動作だと思います。 broadcast_from docu:

ソケットを所有するチャネルは公開メッセージを受信しません。

少し混乱します。私はドキュメントを理解しているので、別のウィンドウを開くとjoinは別のソケットを作成し、最初のウィンドウでテストメッセージを受け取る別のpidを作成します。 1つのウィンドウでは、テストメッセージは表示されません。 2つのウィンドウでは、2つのソケットのうちの他のpidからそれぞれテストメッセージが表示されます。