2017-09-04 5 views
1

J'ai un canal, qui fait certaines choses en back-end lorsque vous vous y connectez. Je dois envoyer une réponse, une fois le travail de back-end terminé. Voici ma chaîne:Elixir/Phoenix Endpoint diffusé à partir d'un autre module

def join("boot", _, socket) do 
    Launcher.start() 
    {:ok, socket} 
    end 

    def handle_in("boot:fetch", params, socket) do 
    payload = %{total_reports: 5} 
    {:reply, {:ok, payload}, socket} 
    end 
Module

Et Launcher est:

defmodule App.Launcher do 
    alias App.Endpoint 

    def start() do 
    Endpoint.broadcast! "boot", "test:my", %{total_reports: 541} 
    end 
end 

Je pensais d'abord recevoir %{total_reports: 541} sur test:my puis %{total_reports: 5} sur boot:fetch dans le front-end. Mais je ne reçois que des données de boot:fetch et non de test:my.

Endpoint.broadcast à partir de Launcher Le module ne diffuse rien. Est-ce un comportement attendu? Pourquoi ne puis-je pas diffuser à partir des modules aliasés par canal?

En outre, j'ai testé mettre exactement la même ligne dans le canal, et cela fonctionne. Pour une raison quelconque, je ne peux pas le faire uniquement avec d'autres modules. Cet exemple fonctionne:

def handle_in("boot:fetch", params, socket) do 
    payload = %{total_reports: 5} 
    Endpoint.broadcast! "boot", "test:my", %{total_reports: 541} 
    {:reply, {:ok, payload}, socket} 
end 

Répondre

0

Mon erreur a été appeler Endpoint.broadcast lors de l'adhésion du canal, mais la connexion n'a pas encore été établie, elle ne pouvait pas diffuser. Déplacé dans la poignée et tout fonctionne.

def join("boot", _, socket) do 
    {:ok, socket} 
end 

def handle_in("boot:fetch", params, socket) do 
    Launcher.start() 
    payload = %{total_reports: 5} 
    {:reply, {:ok, payload}, socket} 
end