从Elixir进程中检索消息

时间:2018-02-16 16:49:14

标签: elixir phoenix-framework

请我尝试了解在Elixir中的进程中发送和接收邮件。

假设我有一个方法定义(来自Github上的库):

 @doc """
  Executes an API command in background. Returns a Job ID. The calling 
  process will receive a message like {:fs_job_result, job_id, packet} 
  with the result.

 """
 @spec bgapi(GenServer.server, String.t, String.t) :: String.t
 def bgapi(name, command, args \\ "") do
 GenServer.call name, {:bgapi, self(), command, args}
 end

和另一个注册监听器的自定义方法

 @doc """
 Registers the caller process as a receiver for all the events for which 
 the filter_fun returns true.
 """
  @spec start_listening(GenServer.server, fun) :: :ok
 def start_listening(name, filter_fun \\ fn(_) -> true end) do
  GenServer.cast name, {:start_listening, self(), filter_fun}
 end

我如何阅读bgapi方法调用返回的消息?

我猜想,

 receive do
    {:fs_job_result, job_id, packet} -> "Recieved!"
  after
   10000 ->
     IO.puts :stderr, "No message in 10 seconds"
  end

打印出No Message in 10 Seconds

我无法接收方法调用的结果,如方法文档中所述。

非常感谢您解决此问题的任何帮助

1 个答案:

答案 0 :(得分:0)

您似乎不了解如何正确创建GenServer。我建议您返回并查看基本教程,如:

https://elixir-lang.org/getting-started/mix-otp/genserver.html

GenServer.call是一个函数,用于将同步消息(需要回复的消息)传递给GenServer。

实施GenServer后,您将实施handle_call回调函数(https://hexdocs.pm/elixir/GenServer.html#c:handle_call/3

GenServer.cast是一个函数,用于将异步消息传递给GenServer,这是您不希望得到答复的消息。您可以在GenServer模块的handle_cast回调中处理此类消息。 (https://hexdocs.pm/elixir/GenServer.html#c:handle_cast/2

在设置GenServer时,对receive的调用是GenServer模块中通用代码的一部分。你不应该直接自己使用这个功能。