2016-08-31 2 views
0

Я следую по книге PragProg «Программирование Феникса», и сейчас я нахожусь в главах о каналах Феникса.Phoenix 1.2 - broadcast_from необходимых разъяснений

В какой-то момент есть пример настройки простого канала с одной темой и обработки сообщений ввода/вывода между клиентом и сервером. Никаких причудливых вещей, все работало как рекламируемое.

Затем я начал исследовать API Phoenix.Channel и нашел функцию «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 

Я ожидал, что при подключении клиента, клиент не получит «тест» сообщения. И это был результат. Пока я не открыл другое окно браузера и не подключился к каналу. В этот момент оба окна начали получать «тестовые» сообщения. Это также произошло, если второе окно было открыто с другого устройства (например, iPhone).

Это обычное поведение или это неправильное использование/недопонимание документации?

Заранее благодарим за поддержку.

ответ

0

Я думаю, что это нормальное поведение. От broadcast_from document:

Канал, которому принадлежит сокет, не получит опубликованное сообщение.

Это немного запутанно. Поскольку я понимаю документ, когда вы открываете другое окно, join создает другой сокет и, следовательно, другой pid, из которого вы получаете тестовое сообщение в своем первом окне. В одном окне вы не увидите тестового сообщения. В двух окнах вы увидите тестовые сообщения из другого pid двух сокетов.

Смежные вопросы