请我尝试了解在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
我无法接收方法调用的结果,如方法文档中所述。
非常感谢您解决此问题的任何帮助
答案 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
模块中通用代码的一部分。你不应该直接自己使用这个功能。