2016-10-18 3 views
0

내 소켓 라우터에서 메시지를 수신 대기하고, 메모리 내 프로세스에 메시지를 보내고, 스폰 된 Runner 모듈을 보낸 다음 결과를 클라이언트에 브로드 캐스팅하려고합니다.정의되지 않은 함수 send/3

독립 실행 형 테스트에서 Phoenix 외부에서는이 코드가 작동합니다. 피닉스로, 나는이 오류를 얻을

~/chatroom:.mix phoenix.server 
Compiling 2 files (.ex) 

== Compilation error on file web/models/runner.ex == 
** (CompileError) web/models/runner.ex:8: undefined function send/3 
    (stdlib) lists.erl:1338: :lists.foreach/2 
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6 
    (elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1 

내 lobby_channel.ex :

defmodule Chatroom.LobbyChannel do 
    require Runner 
    use Phoenix.Channel 

    {:ok, pid: spawn(fn -> Runner.input() end)} 

    def join("lobby", _payload, socket) do 
    {:ok, socket} 
    end 

    def handle_in("new_message", payload, socket) do 
    case payload["message"] do 
     "hello" -> broadcast! socket, "new_message", payload 
     "jump" -> send pid, {:jump, self, [avatar: avatar, socket: socket]} 
     _ -> nil 
    end 

    {:noreply, socket} 
    end 

    receive do 
    {:result, mover, socket} -> broadcast! socket, "new_message", [name: "State", message: "5"] 
    end 
end 

Runner.ex, 웹/모델에 저장/runner.ex

defmodule Runner do 
    def spawn do 
     %{maxJump: 100} 
    end 

    def input do 
     receive do 
     {:run, sender, data} -> send sender, run(sender[:avatar]), data[:socket] 
     {:jump, sender, data} -> send sender, jump(sender[:avatar]), data[:socket] 
    end 

    input 
    end 

    defp run(mover) do 
     mover = case mover.y do 
     1 -> 
      Map.merge(mover, %{y: 0}) 
     _ -> mover 
     end 

     Map.merge(mover, %{x: mover.x + 1}) 
    end 

    defp jump(mover) do 
     case {mover.y} do 
      {0} -> 
      Map.merge(mover, %{y: mover.y + 1}) 
      _ -> 
      mover 
     end 
    end 
end 

왜 수 없습니다 이 메시지를 보내시겠습니까?

답변

1

오류는 세 개의 인수 기능 send를 호출이 표현에서 발생 뭔가를하고 보낼 수있는 메시지를 보낼 과정 :

send sender, run(sender[:avatar]), data[:socket] 

그러나 the send function는 두 개의 인수를 사용할 수 있습니다. 아마도 두 항목을 튜플에 삽입하려고했을 것입니다. 이처럼 :

send sender, {run(sender[:avatar]), data[:socket]} 

는 세 개의 인자, 즉 Process.send/3 소요 send 기능이있다. 세 번째 인수는 옵션 목록입니다. 모듈 이름을 명시 적으로 지정해야합니다.

관련 문제